【线段树】【重庆省选2006】简单题 easy
2013-01-23 10:52
441 查看
简单题(easy)
有一个n个元素的数组,每个元素初始均为0。有m条指令,要么让其中一段连续序列数字反转——0变1,1变0(操作1),要么询问某个元素的值(操作2)。例如当n=20时,10条指令如下:
【输入文件】
输入文件easy.in第一行包含两个整数n,m,表示数组的长度和指令的条数,以下m行,每行的第一个数t表示操作的种类。若t=1,则接下来有两个数L,R(L<=R),表示区间[L,R]的每个数均反转;若t=2,则接下来只有一个数I,表示询问的下标。
【输出文件】
每个操作2输出一行(非0即1),表示每次操作2的回答。
【样例】
【限制】
50%的数据满足:1<=n<=1,000,1<=m<=10,000
100%的数据满足:1<=n<=100,000,1<=m<=500,000
这一题的题目描述很明显,线段树
用一个sum[]数组来统计翻转的次数(奇数次翻转后为1,偶数次为0)
第一次写线段树。。。。。
C++ Code
有一个n个元素的数组,每个元素初始均为0。有m条指令,要么让其中一段连续序列数字反转——0变1,1变0(操作1),要么询问某个元素的值(操作2)。例如当n=20时,10条指令如下:
操作 | 回答 | 操作后的数组 |
1 1 10 | N/A | 11111111110000000000 |
2 6 | 1 | 11111111110000000000 |
2 12 | 0 | 11111111110000000000 |
1 5 12 | N/A | 11110000001100000000 |
2 6 | 0 | 11110000001100000000 |
2 15 | 0 | 11110000001100000000 |
1 6 16 | N/A | 11110111110011110000 |
1 11 17 | N/A | 11110111111100001000 |
2 12 | 1 | 11110111111100001000 |
2 6 | 1 | 11110111111100001000 |
【输入文件】
输入文件easy.in第一行包含两个整数n,m,表示数组的长度和指令的条数,以下m行,每行的第一个数t表示操作的种类。若t=1,则接下来有两个数L,R(L<=R),表示区间[L,R]的每个数均反转;若t=2,则接下来只有一个数I,表示询问的下标。
【输出文件】
每个操作2输出一行(非0即1),表示每次操作2的回答。
【样例】
easy.in | easy.out |
20 10 1 1 10 2 6 2 12 1 5 12 2 6 2 15 1 6 16 1 11 17 2 12 2 6 | 1 0 0 0 1 1 |
【限制】
50%的数据满足:1<=n<=1,000,1<=m<=10,000
100%的数据满足:1<=n<=100,000,1<=m<=500,000
这一题的题目描述很明显,线段树
用一个sum[]数组来统计翻转的次数(奇数次翻转后为1,偶数次为0)
第一次写线段树。。。。。
C++ Code
/* C++ Code http://blog.csdn.net/jiangzh7 By Jiangzh */ #include<cstdio> int n,m; int sum[4*100000+10]; void read() { freopen("easy.in","r",stdin); freopen("easy.out","w",stdout); scanf("%d%d",&n,&m); } void change(int p,int l,int r,int x,int y) { if(x<=l && r<=y) {sum[p]++;return;} int m=(l+r)>>1; if(x<=m) change(p<<1,l,m,x,y);//左儿子中有涉及 if(y>m) change((p<<1)+1,m+1,r,x,y);//右儿子中有涉及 } int count(int p,int l,int r,int x) { if(l==r && x==l) return sum[p]&1; int ans=sum[p]; int m=(l+r)>>1; if(x<=m) {ans+=count(p<<1,l,m,x); return ans&1;} if(x>m) {ans+=count((p<<1)+1,m+1,r,x); return ans&1;} } void work() { for(int i=1;i<=m;i++) { int op,x,y; scanf("%d",&op); if(op==1) { scanf("%d%d",&x,&y); change(1,1,n,x,y); } else{ scanf("%d",&x); printf("%d\n",count(1,1,n,x)); } } } int main() { read(); work(); return 0; }
相关文章推荐
- 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)
- [CQOI 2006]线段树之简单题
- Codeforces 609F Frogs and mosquitoes 二分+简单离散化线段树+Multimap
- hdu4339 Query(简单线段树)
- hdu4614 Vases and Flowers(简单线段树 + 二分)
- BZOJ1513 [POI2006]Tet-Tetris 3D 【二维线段树】
- 【BZOJ】1651: [Usaco2006 Feb]Stall Reservations 专用牛棚(线段树/前缀和 + 差分)
- POJ2828 线段树 简单离线
- (简单) HDU 3397 Sequence operation,线段树+区间合并。
- HDU 5475:An easy problem 这题也能用线段树做???
- 简单易懂线段树-第一步建树-脑袋蒙的来瞧瞧
- UESTC - 1597 An easy problem C (线段树)
- Make life easy 2006世界可用性日北京举行
- HDU 1754 ——简单线段树
- POJ2528 Mayor's posters(线段树成段替换,区间查询,离散化简单hash)
- using the easy connect naming method 简单连接測试
- #POJ3468#关于整数的简单题(线段树)
- EasySegmentedBarView简单易用的自定义分段控件,方便快速实现分段效果
- ZOJ 3349 Special Subsequence 简单DP + 线段树
- UESTC 87 Easy Problem With Numbers(扩展欧几里得+线段树)