BZOJ2821 作詩 Poetize (分塊)

2021-09-30 14:00:26 字數 1484 閱讀 1449

傳送門

給你乙個區間,每次查詢(l,r),問(l,r)中數字出現偶數次的種類數。

分塊**好。。。

分析:

1.查詢(l,r)中的數字出現偶數次的種類數,可以等價於完整塊中數字種類數及不完整塊中數字種類數(前半部分可以預處理,後半部分暴力)時間複雜度o(

n√)

2.對於不完整塊種類數,要考慮與完整塊中數字出現重複,這時我們需要求出完整塊中某個數的個數,再來統計影響。

3.對於求完整塊中數字出現重複,看了其他人的部落格,大部分用到了排序並二分查詢,時間複雜度o(

n√⋅l

ogn)

這裡給出一種犧牲空間複雜度換取時間複雜度的方法:

預處理第一塊到每一塊的每個數出現的次數,時間複雜度o(

n√⋅n

) ,空間複雜度o(

n√⋅n

) ,那麼查詢只需要o(

1),跑下來明顯比前一種方法更為優秀。(當然這時候空間可能會爆,所以要適當調整塊的大小。。)

#include

using

namespace

std;

const

int maxn=1e5+50;

const

int s=430;

inline

int read()

while(isdigit(ch))

return i*f;

}int n,m,c,t,a[maxn],ans[250][250],cnt[250][maxn],c[maxn],bg[maxn],ed[maxn],s;

struct node

}inline

void pre()

if(ed[s]!=n)++s,bg[s]=ed[s-1]+1,ed[s]=n;

int h=1;

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

}memset(c,0,sizeof(c));

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

if(j==ed[h])

}for(int j=bg[i];j<=n;j++)

}}int buf[50];

inline

void w(int x)

int main()

l_b();

pre();

int a=0;

memset(c,0,sizeof(c));

while(m--)

}for(int i=ed[r]+1;i<=r;i++)

}a=tot;

for(int i=l;ifor(int i=ed[r]+1;i<=r;i++)

}else

}a=tot;

for(int i=l;i<=r;i++)

}w(a);

putchar('\n');

}}

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