bzoj2821 作詩 Poetize 分塊

2021-08-16 05:53:51 字數 2115 閱讀 2206

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塊第乙個點開始向右掃 開乙個陣列記錄每乙個數...