神犇sjy虐完heoi之後給傻×lyd出了一題:
shy是t國的公主,平時的一大愛好是作詩。
由於時間緊迫,shy作完詩之後還要虐oi,於是shy找來一篇長度為n的文章,閱讀m次,每次只閱讀其中連續的一段[l,r],從這一段中選出一些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢字都必須在[l,r]裡出現了正偶數次。而且shy認為選出的漢字的種類數(兩個一樣的漢字稱為同一種)越多越好(為了拿到更多的素材!)。於是shy請lyd安排選法。
lyd這種傻×當然不會了,於是向你請教……
問題簡述:n個數,m組詢問,每次問[l,r]中有多少個數出現正偶數次。
輸入格式:
輸入第一行三個整數n、c以及m。表示文章字數、漢字的種類數、要選擇m次。
第二行有n個整數,每個數ai在[1, c]間,代表乙個編碼為ai的漢字。
接下來m行每行兩個整數l和r,設上乙個詢問的答案為ans(第乙個詢問時ans=0),令l=(l+ans)mod n+1, r=(r+ans)mod n+1,若l>r,交換l和r,則本次詢問為[l,r]。
輸出格式:
輸出共m行,每行乙個整數,第i個數表示shy第i次能選出的漢字的最多種類數。
輸入樣例#1:
5 3 5
1 2 2 3 1
0 41 2
2 22 3
3 5輸出樣例#1:20
001對於100%的資料,1<=n,c,m<=10^5
下面講一下做法:
那麼在統計的時候就好統計了:
下面看一下**注釋:
#includeusing namespace std;
const int n=100000+5;
const int b=320;
const int inf=2147483647;
int n, c, m, block, last = 0;
int w[n], b[n];
int sum[b][n];
int ans[b][b];
int cnt[n];
int gi()
while(i>='0'&&i<='9')
return ans * f;
}void init()
for(int j=(i-1)*block+1;j<=n;j++) cnt[w[j]]--;//清空陣列 }}
int query(int x,int y)
for(int i=x;i<=y;i++) cnt[w[i]]--;
return last;
}last = ans[b[x]+1][b[y]-1];
for(int i=x;i<=min(y,b[x]*block);i++)
for(int i=(b[y]-1)*block+1;i<=y && b[x]!=b[y];i++)
for(int i=x;i<=b[x]*block;i++) --cnt[w[i]];
for(int i=(b[y]-1)*block+1;i<=y;i++) --cnt[w[i]];
return last;
}int main()
return 0;
}
洛谷 P4135 作詩 題解
題目傳送門 題目大意 乙個序列,m個詢問,每次詢問區間內有多少個出現過正偶數次的數。考慮用分塊做。分塊的基本套路就是塊與塊之間的資訊可以合併,然而這題並沒有什麼可以合併的。但是可以預處理答案呀!設 f i j f i j f i j 表示第 i ii 塊到第 j jj 塊的答案,那麼可以 o n n...
洛谷P5049 洛谷P5022 題解 旅行
原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...
洛谷練習P2279 P1346
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...