神犇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]。
output
輸出共m行,每行乙個整數,第i個數表示shy第i次能選出的漢字的最多種類數。
5 3 5
1 2 2 3 1
0 4
1 2
2 2
2 3
3 52
0 0 0 1
對於100%的資料,1<=n,c,m<=10^5
分塊嘛
然後思路很顯然
根那個bzoj2724 蒲公英 【分塊】其實差不多,然後我也不知道為什麼常數老是卡不過去,最後想盡各種辦法卡了過去
首先我們可以處理出乙個區間內每一種的個數和區間內的眾數,可以o(
nsqr
t(n)
) o(n
sqrt
(n))
時間內預處理出來
然後對於詢問暴力列舉兩邊的不完整塊就行了
#include
using namespace std;
intread()
#define n 100001
#define m 321
int n,c,m,siz,block_sum,lastans=0;
int a[n],block[n],t[n],l[m],r[m];
int cnt[n][m],ans[m][m];
void init()r[block_sum]=n;
for(int i=1;i<=n;++i)++cnt[a[i]][block[i]];
for(int i=1;i<=c;++i)
for(int j=1;j<=block_sum;++j)
cnt[i][j]+=cnt[i][j-1];
for(int i=1;i<=block_sum;++i)
for(int j=l[i];j<=n;++j)t[a[j]]--;
}}inline int solve(int l,int r)
//排除邊界情況
int pl=block[l]+(l!=l[block[l]]),ll=l[pl]-1;
int pr=block[r]-(r!=r[block[r]]),rr=r[pr]+1;
int res=ans[pl][pr];
for(int i=l;i<=ll;++i)
for(int i=rr;i<=r;++i)
for(int i=l;i<=ll;++i)t[a[i]]--;
for(int i=rr;i<=r;++i)t[a[i]]--;
return res;
}int main()
return
0;}
BZOJ 2821 作詩 (分塊)
問題描述 神犇sjy虐完heoi之後給傻 lyd出了一題 shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩之後還要虐oi,於是shy找來一篇長度為n的文章,閱讀m次,每次只閱讀其中連續的一段 l,r 從這一段中選出一些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢...
bzoj2821 作詩 Poetize 分塊
description 神犇sjy虐完heoi之後給傻 lyd出了一題 shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩 之後還要虐oi,於是shy找來一篇長度為n的文章,閱讀m次,每次只閱讀其中連續的一段 l,r 從這一段中選出一 些漢字構成詩。因為shy喜歡對偶,所以shy規...
BZOJ 2821 作詩 Poetize 分塊
非常神的一道分塊的題 記得剛進bz坑的時候看到這道題50秒特別驚奇0.0 然後我就作死去交了個死迴圈0.0 看了非常多題解 都沒看懂 最後還是把零碎的思想硬拼到一起才寫完0.0 我們首先分塊 然後預處理一些東西 首先是從第i塊到第j塊的答案 這個我們從第i塊第乙個點開始向右掃 開乙個陣列記錄每乙個數...