6759: 异或序列
生活随笔
收集整理的這篇文章主要介紹了
6759: 异或序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
6759: 異或序列
時間限制: 1 Sec??內存限制: 128 MB題目描述
已知一個長度為n的整數數列a1,a2,…,an,給定查詢參數l、r,問在al,al+1,…,ar區間內,有多少子序列滿足異或和等于k。也就是說,對于所有的x,y(l≤x≤y≤r),滿足ax⊕ax+1⊕?⊕ay=k的x,y有多少組。?
輸入
輸入第一行為3個整數n,m,k。第二行為空格分開的n個整數,即a1,a2,…,an。接下來m行,每行兩個整數lj,rj,代表一次查詢。?
輸出
輸出共m行,對應每個查詢的計算結果。?
樣例輸入
4 5 1 1 2 3 1 1 4 1 3 2 3 2 4 4 4?
樣例輸出
4 2 1 2 1?
提示
對于30%的數據,1≤n,m≤1000。
對于100%的數據,1≤n,m≤105,0≤k,ai≤105,1≤lj≤rj≤n。
?
來源/分類
重慶OI2018?
?
看到多次區間查詢,就想到了莫隊算法,但是莫隊中對于區間狀態轉移的處理卻是需要斟酌。
題目已經很明顯的提示了,異或異或,也許我們應該使用異或前綴和,(orz)
對于異或前綴和 我們知道 i and j 之間的異或和 == sum[j]^sum[i-1]?
那么對于l 如果小于 Q.l-1,那么我們就先清除這位置的影響,然后下標++
如果大于Q.l-1,那就下標--,再加上這位置影響
我們要讓求異或為k的組合數
sum[j] ^ sum[i] = k 即 sum[j] ^ k = sum[i]
用cnt 記錄 區間內前綴和的數量變化
那么ans += val * (cnt[sum[j] ^ k])即這個點所造成的k組數影響
?
1 #include<iostream> 2 #include<cstdio> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 1e5+5; 8 int n,m,k; 9 int block; 10 int sum[maxn]; 11 int ans; 12 int tmp; 13 int cnt[maxn]; 14 15 struct node 16 { 17 int l,r,id,ans; 18 friend bool operator < (const node &a,const node&b) 19 { 20 if(a.l / block != b.l / block)return a.l < b.l; 21 return a.r < b.r; 22 } 23 node(){} 24 node(int l,int r,int id):l(l),r(r),id(id){} 25 }Q[maxn]; 26 27 bool cmp(node a,node b) 28 { 29 return a.id < b.id; 30 } 31 32 void revise(int x,int val) 33 { 34 cnt[sum[x]]+=val; 35 ans += val*cnt[sum[x]^k]; 36 } 37 int main() 38 { 39 scanf("%d%d%d",&n,&m,&k); 40 block = sqrt(n); 41 for(int i=1;i<=n;i++) 42 { 43 scanf("%d",&tmp); 44 sum[i] = tmp ^ sum[i-1]; 45 } 46 for(int i=1;i<=m;i++) 47 { 48 scanf("%d%d",&Q[i].l,&Q[i].r); 49 Q[i].id = i; 50 } 51 sort(Q+1,Q+m+1); 52 int l = 1,r = 0; 53 ans = 0; 54 for(int i=1;i<=m;i++) 55 { 56 while(l < Q[i].l - 1)revise(l,-1),l++; 57 while(l > Q[i].l - 1) l--,revise(l,1); 58 while(r < Q[i].r)r++,revise(r,1); 59 while(r > Q[i].r)revise(r,-1),r--; 60 Q[i].ans = ans; 61 } 62 sort(Q+1,Q+m+1,cmp); 63 for(int i=1;i<=m;i++)printf("%d\n",Q[i].ans); 64 return 0; 65 } View Code?
轉載于:https://www.cnblogs.com/iwannabe/p/9539460.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的6759: 异或序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: configparser logging
- 下一篇: 命令模式详解