傳送門
給你乙個區間,每次查詢(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規定最後選出的每個漢字都必須在...