首页 > 其他分享 >CF1685C Bring Balance

CF1685C Bring Balance

时间:2023-12-09 21:11:06浏览次数:28  
标签:括号 int CF1685C 翻转 Bring 序列 Balance 折线图 define

Bring Balance

Luogu CF1685C

题目描述

Alina 有一个长度为 \(2n\) 的括号序列 \(s\),由 \(n\) 个左括号 ( 和 \(n\) 个右括号 ) 组成。她想把这个括号序列变成一个平衡括号序列。

平衡括号序列定义为:能通过插入字符 +1 使之成为合法数学表达式的序列。例如,序列 (())()()(()(())) 是平衡的,而 )((()(()))( 就不是的。

在一次操作中,她可以反转 \(s\) 的任意子串。

请求出最少几次操作可将 \(s\) 转换为平衡括号序列。可以证明,这总是能在 \(n\) 次操作中完成。

\(n\le 10^5\)。

Solution

考虑将括号序列转化成为折线图,( 看作是 \((+1,+1)\),) 看作是 \((+1,-1)\),那么考虑一次翻转在折线图上有什么性质。假设翻转的区间为 \([l,r]\),折线图在 \(x=l\) 处的坐标为 \((l,a)\),在 \(x=r\) 处的坐标为 \((r,b)\),那么这次翻转相当于是将 \([l,r]\) 之间的所有点关于 \((\dfrac{l+r}{2},\dfrac{a+b}{2})\) 中心对称。问题变成如何翻转使得这个折线图所有部分都在 \(x\) 轴之上。

观察发现,最多只需要两次操作就可以使得原序列符合条件。一个点 \((c,d)\) 关于 \((\dfrac{l+r}2,\dfrac{a+b}2)\) 会中心对称到 \((l+r-c,a+b-d)\)。设全局最大值的位置为 \(p\),那么翻转 \([1,p)\) 和 \((p,2n]\) 一定是一个合法解。对于 \([1,p)\) 中的点 \((c,d)\),有 \(d\le y_p\),也就是说 \(a+y_p-d=y_p-d\ge 0\),也就意味着这样翻转后,\([1,p)\) 中的所有点都将在 \(x\) 轴之上。\((p,2n]\) 同理。

那么只需要判断是否存在 \(1\) 次操作或者原本就是合法序列的情况。不操作的情况显然好做。对于只需要一次操作的,先找到第一个和最后一个 \(y<0\) 的点 \(p_1,p_2\),那么翻转的区间 \([L,R]\) 一定有 \(L\le p_1,R\ge p_2\),并且 \(L,R\) 选的位置 \(y\) 越大越好。那么直接找 \([1,p_1)\) 和 \((p_2,2n]\) 中的最大值出现的位置作为 \(L,R\),然后暴力验证即可。

时间复杂度 \(\mathcal O(n)\)。

Code
// Cirno is not baka!
#include <bits/stdc++.h>
#define For(i, a, b) for (int i = (a); i <= (int)(b); ++i)
#define Rof(i, a, b) for (int i = (a); i >= (int)(b); --i)
#define FILE(filename) { \
    freopen(#filename ".in", "r", stdin); \
    freopen(#filename ".out", "w", stdout); \
}
#define All(x) x.begin(), x.end()
#define rAll(x) x.rbegin(), x.rend()
#define pii pair<int, int>
#define fi first
#define se second
#define i64 long long
#define mkp make_pair
// #define int long long
#define epb emplace_back
#define pb push_back
using namespace std;

const int _N = 2e5 + 5, mod = 1e9 + 7, inf = 1e9;
template<typename T> void Max(T &x, T y) {x = max(x, y);}
template<typename T> void Min(T &x, T y) {x = min(x, y);}

namespace BakaCirno {
    int N;
    int A[_N], B[_N];
    bool Check0() {
        return *min_element(A + 1, A + 2 * N + 1) >= 0;
    }
    bool Check1() {
        int p1 = 2 * N + 1, p2 = 0;
        For(i, 1, 2 * N) if (A[i] < 0)
            Min(p1, i), Max(p2, i);
        int l = max_element(A, A + p1 + 1) - A + 1;
        int r = max_element(A + p2 + 1, A + 2 * N + 1) - A;
        reverse(B + l, B + r + 1);
        partial_sum(B + 1, B + 2 * N + 1, B + 1);
        if (*min_element(B + 1, B + 2 * N + 1) >= 0) {
            cout << 1 << '\n';
            cout << l << ' ' << r << '\n';
            return 1;
        }
        return 0;
    }
    void _() {
        cin >> N;
        For(i, 1, 2 * N) {
            char c; cin >> c;
            B[i] = (c == '(' ? 1 : -1);
            A[i] = B[i] + A[i - 1];
        }
        if (Check0()) return cout << 0 << '\n', void();
        if (Check1()) return ;
        cout << 2 << '\n';
        int p = max_element(A + 1, A + 2 * N + 1) - A;
        cout << 1 << ' ' << p - 1 << '\n';
        cout << p + 1 << ' ' << 2 * N << '\n';
    }
}

signed main() {
    // FILE(test);
    cin.tie(0)->sync_with_stdio(0); int T = 1;
    cin >> T;
    while (T--) BakaCirno::_();
    // fout.flush();
}

标签:括号,int,CF1685C,翻转,Bring,序列,Balance,折线图,define
From: https://www.cnblogs.com/hanx16msgr/p/17891501.html

相关文章

  • 『做题记录』[AGC032B] Balanced Neighbors
    [AGC032B]BalancedNeighborslink:https://atcoder.jp/contests/agc032/tasks/agc032_bDescription  给定整数\(N\),构造一个从\(1\)到\(N\)编号的\(N\)个节点的无向图,使得:该图不含有重边和自环,并且是连通的。每个节点的所有邻接节点的编号之和相同。  \(N\l......
  • Paper Reading: Oversampling with Reliably Expanding Minority Class Regions for I
    目录研究动机研究背景研究目的文章贡献本文方法可靠的扩展少数类区域的过采样方法描述方法分析多分类的OREM-MOREM和Boosting的结合计算复杂度实验结果二分类数据集实验实验设置对比实验消融实验调参实验多分类数据集实验对比实验消融实验OREMBoost实验实验设置对比实验优点......
  • [AGC040D] Balance Beam
    [AGC040D]BalanceBeam颇有难度的一道题。首先思考我们的手上有什么武器可以使用。发现如果石板的排列确定下来,那么合法的B一定是形如\([0,x)\)的一段区间。我们只需令\(x\)最大即可。同时,显然可以认为终点一定在整点上。题目中很为难我们的一点是位置并不是离散的,所以......
  • CF1902 A Binary Imbalance 题解
    LinkCF1902ABinaryImbalanceQuestion给出一个01串,可以在任意一个位置\(i\)插入一个字符,如果\(a_i\nea_{i+1}\)插入的字符为\(0\)否则插入的字符为\(1\)问,是否可以通过任意次操作使得串中\(0\)的数量比\(1\)多Solution如果一个串都为\(0\)肯定符合都......
  • The 2023 ICPC Asia Hefei Regional Contest Test D. Balanced Array
    Preface这题赛场上出了个关键点基本都想到的做法,但因为一个地方卡住了没过去导致不得不选择弃掉这道题赛后补了下发现\(O(n\logn)\)的做法是只差临门一脚了,但\(O(n)\)的做法还是trick性挺强的Solution首先考虑枚举\(k\),不难发现此时合法的前缀一定是个连续的区间,其中区间的......
  • 20231128 - 重启Centos后无法远程连接,重启网络服务报错:Error:Failed to start LSB: Br
    1.https://blog.csdn.net/m0_74953387/article/details/1329143062.https://blog.csdn.net/weixin_45894220/article/details/130487066......
  • 【刷题笔记】110. Balanced Binary Tree
    题目Givenabinarytree,determineifitisheight-balanced.Forthisproblem,aheight-balancedbinarytreeisdefinedas:abinarytreeinwhichthedepthofthetwosubtreesofeverynodeneverdifferbymorethan1.Example1:Giventhefollowingtree......
  • VMware NSX Advanced Load Balancer (NSX ALB) 22.1.5 - 多云负载均衡平台
    VMwareNSXAdvancedLoadBalancer(NSXALB)22.1.5-多云负载均衡平台应用交付:多云负载均衡、Web应用防火墙和容器Ingress服务请访问原文链接:https://sysin.org/blog/vmware-nsx-alb-22/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org负载均衡平台NSXAdvan......
  • Balance Addicts 题解
    BalanceAddicts题目大意给定序列\(a\),求有多少种合法的划分方案。定义一种划分方案是合法的当且仅当划分出的各段序列的和构成回文序列。思路分析一种不太一样的做法。我们先对\(a\)做一遍前缀和,得到\(s\)。观察各段序列的和形式:\[s_{p_1},s_{p_2}-s_{p_1},s_{p_3}......
  • Maximum Balanced Circle
    here首先根据题意,我们不难有数字是连续的这种感悟。而且限制是值域上的,从下标入手发现难以突破,便从值域上入手。从小到大考虑每个数字,然后dp,可以参考这篇题解。至于方案的输出,有两种情况。只有自己\(i\)和\(i-1\),直接输出即可。有自己和\(i-1\)的环,定义print输出环,且最大......