标签:反转 add time test bsp scan 种类 dash freopen
题目来源: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; }
标签:反转 add time test bsp scan 种类 dash freopen
原文地址:https://www.cnblogs.com/fdezlsq/p/11432294.html