日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6759: 异或序列

發布時間:2023/12/1 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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: 异或序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。