description
神犇sjy虐完heoi之後給傻×lyd出了一題:shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩
之後還要虐oi,於是shy找來一篇長度為n的文章,閱讀m次,每次只閱讀其中連續的一段[l,r],從這一段中選出一
些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢字都必須在[l,r]裡出現了正偶數次。而且shy認
為選出的漢字的種類數(兩個一樣的漢字稱為同一種)越多越好(為了拿到更多的素材!)。於是shy請lyd安排選
法。lyd這種傻×當然不會了,於是向你請教……問題簡述:n個數,m組詢問,每次問[l,r]中有多少個數出現正偶
數次。input
輸入第一行三個整數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次能選出的漢字的最多種類數。
sample input
5 3 5
1 2 2 3 1
0 4
1 2
2 2
2 3
3 5sample output
2 0
0 0
1hint
對於100%的資料,1<=n,c,m<=10^5
直接分塊。
預處理出所有塊之間的答案,用字首和預處理出每個數在某段區間內的出現次數。
詢問的時候分情況考慮。
如果l,r中間沒塊直接暴力掃過去。
否則先用塊內的答案,然後不完整塊掃一遍,結合每個數在完整塊的出現次數統計答案即可。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int n = 100010, m = 318;
int read()
while(ch >= '0' && ch <= '9')
return x * f;
}int v[n], cnt[n], val[n], bl[n], f[m][m], s[m][n], blo, n, id;
void add(int l, int r)
void solve(int l, int r, int *sl, int *sr, int &ans)
else
if((p & 1) ^ c)
ans += p & 1 ? 1 : -1;
cnt[v[i]] = 0;
}}int query(int l, int r)
return ans;
}ans = f[bl[l] + 1][bl[r] - 1];
add(l, bl[l] * blo); add((bl[r] - 1) * blo + 1, r);
solve(l, bl[l] * blo, s[bl[l]], s[bl[r] - 1], ans);
solve((bl[r] - 1) * blo + 1, r, s[bl[l]], s[bl[r] - 1], ans);
return ans;
}int main() int tot = 0;
for(int i = 1;i <= bl[n]; ++i)
memset(cnt, 0, sizeof(cnt)), tot = 0;
}int ans = 0;
while(m--)
return
0;}
BZOJ 2821 作詩 (分塊)
問題描述 神犇sjy虐完heoi之後給傻 lyd出了一題 shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩之後還要虐oi,於是shy找來一篇長度為n的文章,閱讀m次,每次只閱讀其中連續的一段 l,r 從這一段中選出一些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢...
BZOJ2821 作詩 Poetize 分塊
神犇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塊第乙個點開始向右掃 開乙個陣列記錄每乙個數...