BZOJ 2821 作詩 Poetize 分塊

2021-09-06 21:49:08 字數 1203 閱讀 1457

非常神的一道分塊的題……記得剛進bz坑的時候看到這道題50秒特別驚奇0.0 然後我就作死去交了個死迴圈0.0

看了非常多題解 都沒看懂 最後還是把零碎的思想硬拼到一起才寫完0.0

我們首先分塊 然後預處理一些東西

首先是從第i塊到第j塊的答案 這個我們從第i塊第乙個點開始向右掃 開乙個陣列記錄每乙個數的出現次數 掃到乙個數就更改一下出現次數 同一時候更新答案 每掃完一塊就記錄一下答案

然後是前i塊中每乙個數出現的次數 這個我們掃一遍陣列 統計出第i塊中每乙個數出現的次數 然後求字首和就可以

詢問時首先將塊中的答案計入ans 然後對於塊兩邊的剩餘部分存進乙個陣列 排序 然後對於每乙個數依據塊中的出現次數調整答案就可以

記得詢問區間不足一塊時要特判

時間複雜度o(m√nlogn)

#include#include#include#include#include#define m 100100

using namespace std;

int n,c,m,block,ans,a[m];

int block_ans[320][320],block_cnt[320][m];

int f[m],tim[m],tot;

int stack[m],top;

int main()

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

for(i=1;i*block+1<=n;i++)

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

block_cnt[i][j]+=block_cnt[i-1][j];

for(i=1;i<=m;i++)

printf("%d\n",ans);

continue;

} int b1=(x-1)/block+1;

int b2=(y-1)/block;

ans=block_ans[b1][b2];

top=0;

for(j=x;j<=b1*block;j++)

stack[++top]=a[j];

for(j=b2*block+1;j<=y;j++)

stack[++top]=a[j];

sort(stack+1,stack+top+1);

int cnt=0;

for(j=1;j<=top;j++)

}printf("%d\n",ans);

}}

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規定最後選出的每個漢字都必須在...