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的下标能组成等比数列 ...
随机推荐
- Android 手机卫士5--手机防盗
1,界面介绍 跳转到导航界面的第1个,描述功能 跳转到导航界面的第2个,必须,绑定sim卡,才可以跳转到第三个界面跳转到导航界面的第3个,必须输入电话号码,(两种途径(1,输入2,选择))跳转到导航界 ...
- C#微信公众平台开发者模式开启代码
using System;using System.IO;using System.Text;using System.Web.Security; namespace HPZJ.Web.sys.exc ...
- css知多少(8)——float上篇
1. 引言 对于我们所有的web前端开发人员,float是或者曾经一度是你最熟悉的陌生人——你离不开它,却整天承受着它所带给你的各种痛苦,你以为它很简单就那么一点知识,但却驾驭不了它各种奇怪的现象. ...
- jQuery Transit 过渡效果
jQuery Transit 使用 CSS3 的新特性来实现过渡效果,比默认的.animate方法要顺畅得多. 因为使用 CSS3 进行过渡效果,所以对不支持 CSS3 的浏览器效果有所下降. 语法和 ...
- browser.html – HTML 实现 Firefox UI
browser.html 是一个实验性的项目,用于证明一个概念:使用 HTML 重新实现 Firefox UI ,并作为一个应用程序.它是基于浏览器的 API ,并以浏览器的方式和系统的应用工作.即使 ...
- PS教程:20个新鲜出炉的 Photoshop 中级教程
Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享最新20个 Photoshop 进阶教程,提高你的图片处理技巧,制作时尚的效果.这些教程可以帮助把你的想法 ...
- [deviceone开发]-do_FrameAnimtionView的简单动画示例
一.简介 do_FrameAnimtionView组件是用加载GIF动态图片和加载一系列图片形成动画效果的展示组件,这个示例直观的展示组件基本的使用方式.适合初学者. 二.效果图 三.相关下载 htt ...
- [deviceone开发]-购物车的简单示例
一.简介 主要是演示listview所在的ui和模板cell所在的ui之间数据的交互,点击一行,可以通过加减数量,自动把所有选中的汽车价格显示在底部. 二.效果图 三.示例地址: http://sou ...
- angular源码分析:图解angular的启动流程
今天做了一些图来说明angular,由于angular实在太复杂了,不知道用什么图表示比较好,所以就胡乱画了一些,希望有人能看得懂. 一.源码文件编译合并顺序图 二.angular.module函数功 ...
- C#各种数组直接的数据复制/转换
之前做Opengl程序,用的的C#的SharpGL这个库,里面有各种奇怪绑定的函数,比如原型为: void glInterleavedArrays(uint format, int stride, v ...