Brackets(bestcoder)
每次询问一个区间都根据最开始的线段树在询问的区间重建一棵线段树
view code#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int, int >
using namespace std;
typedef long long LL;
const int N = 200010;
int _, n, Q;
char str[N];
PII sum[N << 2], tmp[N << 2]; PII pushUp(PII &l, PII &r) {
PII ans = make_pair(l.first, r.second);
int mi = min(l.second, r.first);
ans.first += r.first - mi;
ans.second += l.second - mi;
return ans;
} void build(int l, int r, int rt) {
if(l == r) {
sum[rt] = make_pair(str[l] == ')', str[l] == '(');
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
sum[rt] = pushUp(sum[rt << 1], sum[rt << 1 | 1]);
} void update(int p, int l, int r, int rt) {
if(l == r) {
sum[rt].first ^= 1;
sum[rt].second ^= 1;
return ;
}
int m = (l + r) >> 1;
if(p <= m) update(p, lson);
else update(p, rson);
sum[rt] = pushUp(sum[rt << 1], sum[rt << 1 | 1]);
} void query(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) {
tmp[rt] = sum[rt];
return ;
}
int m = (l + r) >> 1;
tmp[rt << 1] = tmp[rt << 1 | 1] = make_pair(0, 0);
if(L <= m) query(L, R, lson);
if(R > m) query(L, R, rson);
tmp[rt] = pushUp(tmp[rt << 1], tmp[rt << 1 | 1]);
} int query2(int L, int R, int k, int l, int r, int rt) {
if(tmp[rt].first + tmp[rt].second < k) return -1;
if(l == r) return l;
int m = (l + r) >> 1;
if(R <= m) return query2(L, R, k, lson);
if(L > m) return query2(L, R, k, rson); if(L <= l && R >= m) tmp[rt << 1] = sum[rt << 1];
if(L <= m + 1 && R >= r) tmp[rt << 1 | 1] = sum[rt << 1 | 1]; int num = tmp[rt << 1].first;
if(tmp[rt << 1].second > tmp[rt << 1 | 1].first) {
num += tmp[rt << 1].second - tmp[rt << 1 | 1].first;
}
if(k <= num) return query2(L, R, k, lson);
int now = k - num; now += min(tmp[rt << 1 | 1].first, tmp[rt << 1].second);
return query2(L, R, now, rson);
} void solve() {
scanf("%d%d%s", &n, &Q, str + 1); build(1, n, 1); int a, b, c, d;
while(Q--) {
scanf("%d", &a);
if(a == 1) {
scanf("%d", &b);
update(b, 1, n, 1);
} else {
scanf("%d%d%d", &b, &c, &d);
query(b, c, 1, n, 1);
int ans = query2(b, c, d, 1, n, 1);
printf("%d\n", ans);
}
}
} int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
cin >> _;
while(_--) solve();
return 0;
}
Brackets(bestcoder)的更多相关文章
- Brackets
按下Ctrl + E("编辑")或退出编辑.Brackets将搜索项目下所有CSS文件 Ctrl/Cmd + Alt + P 打开即时预览功能 alt + command + O目 ...
- Bestcoder#5 1002
Bestcoder#5 1002 Poor MitsuiTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- BestCoder Round #80 1002
HDU 5666 Segment 题意:给你条斜率为-1,常数项为q(q为质数)的直线,连接原点与直线上整数格点,问你在有多少个格点在形成的无数个三角形内,而不在线段上,结果对P取模. 思路:best ...
- CF380C. Sereja and Brackets[线段树 区间合并]
C. Sereja and Brackets time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Brackets前端开发IDE工具
Brackets是一个开源的前端开发IDE工具,网页设计师和前端开发人员必备的前端开发IDE工具. 它能够使你在开发WEB网站实时预览你的网页,目前版本只适用于Chrome浏览器可以实时预览效果 支持 ...
- Bestcoder#5 1003
Bestcoder#5 1003 Poor RukawTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- BestCoder 2nd Anniversary
A题 Oracle http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=703&pid=1001 大数相加: ...
- Bestcoder Round #84
A题 Aaronson http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=718&pid=1001 感觉一 ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
随机推荐
- Redis学习笔记1-Redis数据类型
Redis数据类型 Redis支持5种数据类型,它们描述如下: Strings - 字符串 字符串是 Redis 最基本的数据类型.Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串 ...
- (转载)Windows常见性能计数器(较好的说明)
转载地址:http://blog.csdn.net/dfbrt56/article/details/3341591 Windows常见性能计数器 性能计数器(counter)是描述服务器或操作系统性能 ...
- SVG Drawing Animation - SVG 绘制动画
一个小实验,探索 SVG 线图动画的使用情况,以前沿的展示形式呈现图形或网站元素的外观,模拟它们的加载.SVG 真的很强大,有许多创造性和可能性,使用 SVG 可以制作各种有趣的网站交互效果.今天这篇 ...
- javascript数据类型理解整理
起因:关于数据类型这块,自己看了很多遍相关的资料,每次查看和实践都有一些体会和理解:但又感到没有理解透,总是差一点,最近又在看这块的内容,加上最近的积累,做个相关笔记 ECMAScript数据类型:1 ...
- JavaScript实现HTML5烟花特效
烟花效果如下(请使用支持HTML5的浏览器查看):点击这里查看效果:http://keleyi.com/keleyi/phtml/html5/14.htm 源代码如下: ;}</style> ...
- 【经验之谈】前端面试知识点总结(CSS相关)——附答案
目录 二.CSS部分 1.解释一下CSS的盒子模型? 2.请你说说CSS选择器的类型有哪些,并举几个例子说明其用法? 3.请你说说CSS有什么特殊性?(优先级.计算特殊值) 4.要动态改变层中内容可以 ...
- eclipse提示:This tag and its children can be replaced by one <TextView/> and a compound drawable
今天在学习android开发的时候,写了这样的一段代码: <?xml version="1.0" encoding="utf-8"?> <Li ...
- 【移动适配】移动Web怎么做屏幕适配(三)
复杂纷扰的世界背后,总会有万变不离其宗的简单规则 啃先生 Mar.8th.2016 壹 | Fisrt 前面写了两篇移动适配相关的文章: <移动Web怎么做屏幕适配(一)>重点介绍了怎样利 ...
- 极其简单的搭建eclipse的android开发环境
这篇博客是关于如何搭建eclipse的android开发环境, 与网上的其他博客不同,我的方法比他们简单的多,所 以推荐给大家. 搭建eclipse的android开发环境步骤: 1.配置JDK(Ja ...
- iOS通讯录开发
场景一:直接选择一个联系人的电话号码 这里不需要先获取所有的联系人自己做联系人列表,直接使用系统自带的AddressBookUI/ABPeoplePickerNavigationController. ...