BZOJ 2821 作诗(Poetize)
2016-10-12 22:49
363 查看
Description
神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗。由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一些汉字构成诗。因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次。而且SHY认为选出的汉字的种类数(两个一样的汉字称为同一种)越多越好(为了拿到更多的素材!)。于是SHY请LYD安排选法。LYD这种傻×当然不会了,于是向你请教……问题简述:N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次。
【题目分析】
分块
【代码】
神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗。由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一些汉字构成诗。因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次。而且SHY认为选出的汉字的种类数(两个一样的汉字称为同一种)越多越好(为了拿到更多的素材!)。于是SHY请LYD安排选法。LYD这种傻×当然不会了,于是向你请教……问题简述:N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次。
【题目分析】
分块
【代码】
#include <cmath> #include <cstring> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; int cnt[100010],bel[100010],a[100010]; int sum[100010][321],ans[321][321]; int n,m,w,tmp,l,r,ll,rr; inline int read() { int ret=0,f=1; char ch=getchar(); while (ch>'9'||ch<'0') { if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9') { ret*=10; ret+=ch-'0'; ch=getchar(); } return ret*f; } int main() { n=read(); read(); m=read(); for (int i=1;i<=n;++i) a[i]=read(); w=floor(sqrt(n))+1; for (int i=1;i<=n;++i) bel[i]=(i-1)/w+1; for (int i=1;i<=n;++i) sum[a[i]][bel[i]]++; for (int i=1;i<=100000;++i) for (int j=1;j<=bel ;++j) sum[i][j]+=sum[i][j-1]; for (int i=1;i<=bel ;++i) { tmp=0; for (int j=(i-1)*w+1;j<=n;++j) { cnt[a[j]]++; if (cnt[a[j]]&&cnt[a[j]]%2==0) tmp++; else if (cnt[a[j]]>2) tmp--; ans[i][bel[j]]=tmp; } for (int j=(i-1)*w+1;j<=n;++j) cnt[a[j]]--; // memset(cnt,0,sizeof cnt); } tmp=0; while (m--) { scanf("%d%d",&l,&r); l=(l+tmp)%n+1,r=(r+tmp)%n+1; if (l>r) swap(l,r); ll=bel[l];rr=bel[r]; if (rr-ll<=1) { tmp=0; for (int i=l;i<=r;++i) { cnt[a[i]]++; if (cnt[a[i]]&&cnt[a[i]]%2==0) tmp++; else if (cnt[a[i]]>2) tmp--; } for (int i=l;i<=r;++i) cnt[a[i]]--; printf("%d\n",tmp); continue; } tmp=ans[ll+1][rr-1]; for (int i=l;i<=ll*w;++i) { cnt[a[i]]++; if (cnt[a[i]]+sum[a[i]][rr-1]-sum[a[i]][ll]&&(cnt[a[i]]+sum[a[i]][rr-1]-sum[a[i]][ll])%2==0) tmp++; else if (cnt[a[i]]+sum[a[i]][rr-1]-sum[a[i]][ll]>2) tmp--; } for (int i=(rr-1)*w+1;i<=r;++i) { cnt[a[i]]++; if (cnt[a[i]]+sum[a[i]][rr-1]-sum[a[i]][ll]&&(cnt[a[i]]+sum[a[i]][rr-1]-sum[a[i]][ll])%2==0) tmp++; else if (cnt[a[i]]+sum[a[i]][rr-1]-sum[a[i]][ll]>2) tmp--; } printf("%d\n",tmp); for (int i=l;i<=ll*w;++i) cnt[a[i]]--; for (int i=(rr-1)*w+1;i<=r;++i) cnt[a[i]]--; } }
相关文章推荐
- [BZOJ 2821] 作诗(Poetize) 【分块】
- BZOJ 2821: 作诗(Poetize)( 分块 )
- bzoj 2821: 作诗(Poetize) 分块
- 【bzoj2821】作诗(Poetize)
- BZOJ2821 作诗(Poetize) 【分块】
- bzoj 2821: 作诗(Poetize)
- [bzoj] 2821 作诗(Poetize) || 分块
- BZOJ 2821 作诗(Poetize) 分块
- 【分块】BZOJ2821 作诗(Poetize)
- bzoj2821 作诗(Poetize)
- BZOJ_2821_作诗(Poetize)_分块
- BZOJ 2821 作诗(Poetize) 分块
- bzoj2821: 作诗(Poetize)【分块】
- bzoj 2821: 作诗(Poetize)
- BZOJ 2821: 作诗(Poetize)
- 【bzoj2821】作诗(Poetize)
- BZOJ 2821 作诗(Poetize) 分块
- BZOJ 2821 作诗(Poetize) 分块
- BZOJ 2821 作诗(Poetize)(分块)
- BZOJ 2821: 作诗(Poetize) | 分块