刷題總結 作詩(bzoj2821)

2022-05-23 13:30:09 字數 1740 閱讀 9541

神犇sjy虐完heoi之後給傻×lyd出了一題:shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩

些漢字構成詩。因為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次能選出的漢字的最多種類數。

5 3 5

1 2 2 3 1

0 41 2

2 22 3

3 5200

01對於100%的資料,1<=n,c,m<=10^5

by lydrainbowcat

不得不吐槽這個題目太囉嗦了····給最後一句話就可以了·····

和之前演算法複習裡的例題幾乎是一樣的,預處理cnt[i][j]表示數i在前j個塊中的數量,ans[i][j]為第i個塊到第j個塊的答案·····然後就是分塊的套路了···詳細見**···

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=1e5+5

;const

int m=320

;int

tots,s,sum[n][m],ans[m][m],n,c,m,num[n],id[n],left[m],right[m],tot[n],tim,visit[n];

bool

jud[n];

inline

intr()

inline

void

pre()

right[tots]=n,jud[n]=true;

for(int i=1;i<=n;i++)

sum[num[i]][id[i]]++;

for(int i=2;i<=tots;i++)

for(int j=1;j<=c;j++)

sum[j][i]+=sum[j][i-1

];

tim=0;

for(int i=1;i<=tots;i++)

}memset(visit,

0,sizeof

(visit));

}inline

int getans(int a,int

b)

return

cn; }

else

for(int i=right[rights]+1;i<=b;i++)

return

cn; }

}int

main()

return0;

}

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規...

BZOJ2821 作詩 Poetize 分塊

神犇sjy虐完heoi之後給傻 lyd出了一題 shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩之後還要虐oi,於是shy找來一篇長度為n的文章,閱讀m次,每次只閱讀其中連續的一段 l,r 從這一段中選出一些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢字都必須在...