洛谷P4135 作詩

2022-02-27 09:43:39 字數 1598 閱讀 7998

神犇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。由於火星上非常乾燥,經常引發火...