#10117 「一本通 4.1 练习 2」简单题
Posted fdezlsq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#10117 「一本通 4.1 练习 2」简单题相关的知识,希望对你有一定的参考价值。
1539:简单题
时间限制: 1000 ms 内存限制: 524288 KB
提交数: 299 通过数: 161
【题目描述】
题目来源:CQOI 2006
有一个 nn 个元素的数组,每个元素初始均为 00。有 mm 条指令,要么让其中一段连续序列数字反转——00 变 11,11 变 00(操作 11),要么询问某个元素的值(操作 22)。
例如当 n=20n=20 时,1010 条指令如下:
操作 | 回答 | 操作后的数组 |
1 1 101 1 10 | N/AN/A | 1111111111000000000011111111110000000000 |
2 62 6 | 11 | 111111–11110000000000111111_11110000000000 |
2 122 12 | 00 | 111111111100–00000000111111111100_00000000 |
1 5 121 5 12 | N/AN/A | 1111000000110000000011110000001100000000 |
2 62 6 | 00 | 111100–00001100000000111100_00001100000000 |
2 152 15 | 00 | 111100000011000–00000111100000011000_00000 |
1 6 161 6 16 | N/AN/A | 1111011111001111000011110111110011110000 |
1 11 171 11 17 | N/AN/A | 1111011111110000100011110111111100001000 |
2 122 12 | 11 | 111101111111–00001000111101111111_00001000 |
2 62 6 | 11 | 111101–11111100001000111101_11111100001000 |
【输入】
第一行包含两个整数 n,mn,m,表示数组的长度和指令的条数;
以下 mm 行,每行的第一个数 tt 表示操作的种类:
若 t=1t=1,则接下来有两个数 L,RL,R,表示区间 [L,RL,R] 的每个数均反转;
若 t=2t=2,则接下来只有一个数 ii,表示询问的下标。
【输出】
每个操作 22 输出一行(非 00 即 11),表示每次操作 22 的回答。
【输入样例】
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≤103,1≤m≤1041≤n≤103,1≤m≤104 ;
对于 100% 的数据,1≤n≤105,1≤m≤5×1051≤n≤105,1≤m≤5×105 ,保证 L≤RL≤R。
【来源】
#include<bits/stdc++.h> using namespace std; int a[100005]; int n,k; int Add(int x,int p) for(;x<=n;x+=x&(-x))a[x]+=p; int Que(int x) int res=0; for(;x>0;x-=x&(-x))res+=a[x]; return res; int main() //freopen("test.in","r",stdin); scanf("%d%d",&n,&k); while(k--) int t,l,r; scanf("%d",&t); if(t-1)scanf("%d",&l),printf("%d\n",Que(l)%2); else scanf("%d%d",&l,&r),Add(l,1),Add(r+1,-1); return 0;
以上是关于#10117 「一本通 4.1 练习 2」简单题的主要内容,如果未能解决你的问题,请参考以下文章
loj10195. 「一本通 6.1 练习 2」转圈游戏 (loj2608)