E. XOR and Favorite Number (莫队板子题)
复制代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 inline int read() 5 { 6 int x=0,f=1;char ch=getchar(); 7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 8 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 9 return x*f; 10 } 11 12 /********************************************************************/ 13 14 const int maxn = 1e5+7; 15 int n, m, k; 16 int a[maxn], belong[maxn]; 17 ll ans[maxn], flag[maxn*20]; //注意这里的flag 要大大大大 18 ll now; 19 20 struct node{ 21 int l, r; 22 int id; 23 }q[maxn]; 24 25 bool cmp(node x, node y){ 26 if(belong[x.l] == belong[y.l]) 27 return x.r < y.r; 28 return belong[x.l] < belong[y.l]; 29 } 30 31 void Update(int x){ 32 now += flag[a[x]^k]; 33 flag[a[x]]++; 34 } 35 36 void Delete(int x){ 37 flag[a[x]]--; 38 now -= flag[a[x]^k]; 39 } 40 41 int main(){ 42 n = read(); m = read(); k = read(); 43 int sz = ceil(sqrt(n)); 44 for(int i = 1;i <= n;i++){ 45 a[i] = read(); 46 belong[i] = (i-1)/sz; 47 } 48 //前缀异或 49 for(int i = 1;i <= n;i++){ 50 a[i] = a[i-1]^a[i]; 51 } 52 for(int i = 1;i <= m;i++){ 53 q[i].l = read(); q[i].r = read(); 54 q[i].id = i; 55 } 56 sort(q+1, q+1+m, cmp); 57 int l = 1, r = 0; 58 now = 0; 59 flag[0] = 1; 60 for(int i = 1;i <= m;i++){ 61 int id = q[i].id; 62 63 //while里面的顺序是不能随意更改的 64 while(l < q[i].l){ 65 Delete(l-1); 66 l++; 67 } 68 while(l > q[i].l){ 69 l--; 70 Update(l-1); 71 } 72 while(r < q[i].r){ 73 r++; 74 Update(r); 75 } 76 while(r > q[i].r){ 77 Delete(r); 78 r--; 79 } 80 ans[id] = now; 81 } 82 for(int i = 1;i <= m;i++){ 83 cout << ans[i] << endl; 84 } 85 return 0; 86 }
分类:
莫队算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2017-09-11 hdu6195 cable cable cable(from 2017 ACM/ICPC Asia Regional Shenyang Online)
2017-09-11 hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)