Gym 100803G 线段树

好长时间前做的题,来补一下题解。

给出括号化的序列,每次改变一个括号方向,求出下标p,是的改变p处的括号方向可以使括号化仍然成立,且p最小。

保证括号化看似和线段树没有联系,我们可以把括号"("表示为1,把括号")"表示为-1,则保证括号化的充要条件就是使数字序列前缀和始终大于等于零

用线段树维护前缀和

查询有两种情况

1. "(" 变成 ")"

这种情况我们只需找到最左边的一个")",就是答案。(可以用一个set维护所有的")"的位置)

2.")" 变成 "("

这种情况我们要找一个最左边的“(”变成”)“,也就是把p处及以后的前缀和都减2,且不能出现负的前缀和。

于是我们就要借助线段树查询前缀和小于2的最右边节点,这样把区间[p + 1, n]减二之后才不会出现负值。

用线段树维护区间最小值,也就是区间最小前缀和。线段树能往右走就往又走,注意查询过程中区间边界的特判处理。

 

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<set>
  5 #include<iostream>
  6 #define lson o << 1, L, M
  7 #define rson (o << 1) | 1, M + 1, R
  8 using namespace std;
  9 const int MAXN = 300010;
 10 const int INF = 0x3f3f3f3f;
 11 char str[MAXN];
 12 int num[MAXN];
 13 int minv[MAXN << 2];
 14 int addv[MAXN << 2];
 15 int len;
 16 void pushup(int o, int L, int R) {
 17     minv[o] = 0;
 18     if(R > L) {
 19         minv[o] = min(minv[o << 1], minv[(o << 1) | 1]);
 20     }
 21     minv[o] += addv[o];
 22 }
 23 void update(int p, int v, int o, int L, int R) {
 24     if(p == L && p == R) {
 25         addv[o] = v;
 26         minv[o] = 0;
 27     } else {
 28         int M = L + (R - L) / 2;
 29         if(p <= M) update(p, v, lson);
 30         else update(p, v, rson);
 31         
 32     }pushup(o, L, R);
 33 }
 34 void add(int l, int r, int v, int o, int L, int R) {
 35     if(l <= L && r >= R) {
 36         addv[o] += v;
 37     } else {
 38         int M = L + (R - L) / 2;
 39         if(l <= M)add(l, r, v, lson);
 40         if(r > M) add(l, r, v, rson);
 41     }
 42     pushup(o, L, R);
 43 }
 44 int query_min(int l ,int r, int add, int o, int L, int R) {
 45     if(l <= L && r >= R) {
 46         return minv[o] + add;
 47     } else {
 48         int M = L + (R - L) / 2;
 49         int res = INF;
 50         if(l <= M) res = min(res, query_min(l, r, add + addv[o],lson));
 51         if(r > M) res = min(res, query_min(l, r, add + addv[o], rson));
 52         return res;
 53     }
 54 }
 55 int query(int l, int r, int add, int o, int L, int R) { //cout << L << "!!!" << R << endl;
 56     if(L == R) {
 57         if(L == 1) {
 58             if(minv[o] + add >= 2) return 0;
 59             return L;
 60         } else {
 61             return L;
 62         }
 63     }
 64     int M = L + (R - L) / 2;
 65     if(r < M + 1) return query(l, r, add + addv[o], lson);
 66     int minr = query_min(M + 1, min(r, R), 0, 1, 1, len);
 67     if(minr < 2) return query(l, r, add + addv[o], rson);
 68     return query(l, r, add + addv[o], lson);
 69 }
 70 int main() {
 71     int n, q; set<int> fir;
 72     scanf("%d%d", &n, &q);
 73     scanf("%s", str + 1);
 74     len = n;
 75     for(int i = 1 ; i <= len ; i++)
 76         if(str[i] == '(') num[i] = 1;
 77         else {
 78             num[i] = -1;
 79             fir.insert(i);
 80         }
 81     for(int i = 1 ; i <= len ; i++) num[i] += num[i - 1];
 82     for(int i = 1 ; i <= len ; i++) update(i, num[i], 1, 1, len);
 83     //cout << query_min(1, 1, 0, 1, 1, len) << "!!" << endl;
 84     for(int i = 0 ; i < q ; i++) {
 85         //cout << str + 1 << endl;
 86         int pos; scanf("%d", &pos);
 87         if(str[pos] == '(') {
 88             str[pos] = ')';
 89             fir.insert(pos);
 90             int pp = *fir.begin();
 91             fir.erase(fir.begin());
 92             add(pos, len, -2, 1, 1, len);
 93             add(pp, len, 2, 1, 1, len);
 94             printf("%d\n", pp);
 95             str[pp] = '(';
 96         } else { // str[pos] == ')'
 97             str[pos] = '(';
 98             add(pos, len, 2, 1, 1, len);
 99             fir.erase(pos);
100             int pp = query(1, pos, 0, 1, 1, len);
101             //cout << pp << "~~" << endl;
102             pp++;
103             str[pp] = ')';
104             fir.insert(pp);
105             add(pp, len, -2, 1, 1, len);
106             printf("%d\n", pp);
107         }
108     }
109     return 0;
110 }

 

转载于:https://www.cnblogs.com/tooyoungtoosimple/p/5014430.html

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值