2821: 作诗(Poetize)

Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 3265  Solved: 951
[Submit][Status][Discuss]

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]中有多少个数出现正偶
数次。

Input

输入第一行三个整数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]。

Output

输出共m行,每行一个整数,第i个数表示SHY第i次能选出的汉字的最多种类数。

Sample Input

5 3 5
1 2 2 3 1
0 4
1 2
2 2
2 3
3 5

Sample Output

2
0
0
0
1

HINT

对于100%的数据,1<=n,c,m<=10^5

题解

分块,每块大小为sqrt(n/logn)

维护两个块内的ans

对于查询操作:

若并未经过完整的块,暴力求解

若经过了完整的块,二分不在块内的至多(2*块的大小)个元素的值在询问区间内出现的次数和在询问区间内的整块中出现的次数

判断对答案的影响

代码

//by 减维
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<map>
#include<bitset>
#include<algorithm>
#define ll long long
#define maxn 100005
#define inf 1<<30
using namespace std; struct node{int v,p;}b[maxn]; int n,c,m,blo,a[maxn],pos[maxn],tmp[maxn],fir[maxn],las[maxn],mark[maxn];
int f[][],L[],R[]; bool cmp(const node&x,const node&y)
{
if(x.v==y.v)return x.p<y.p;
return x.v<y.v;
} void pre()
{
int tot;
for(int i=;i<=pos[n];++i)
{
for(int j=L[i];j<=n;++j)tmp[a[j]]=;
tot=;
for(int j=L[i];j<=n;++j)
{
if(tmp[a[j]]%==&&tmp[a[j]]!=)tot--;
tmp[a[j]]++;
if(tmp[a[j]]%==&&tmp[a[j]]!=)tot++;
f[i][pos[j]]=tot;
}
}
for(int i=;i<=n;++i)b[i].v=a[i],b[i].p=i;
sort(b+,b+n+,cmp);
for(int i=;i<=n;++i){
if(!fir[b[i].v])fir[b[i].v]=i;
las[b[i].v]=i;
}
} int findup(int x,int val)
{
int l=fir[val],r=las[val];
int tmp=;
while(l<=r)
{
int mid=(l+r)>>;
if(x<b[mid].p)r=mid-;
else l=mid+,tmp=mid;
}
return tmp;
} int finddown(int x,int val)
{
int l=fir[val],r=las[val];
int tmp=inf;
while(l<=r)
{
int mid=(l+r)>>;
if(x>b[mid].p)l=mid+;
else r=mid-,tmp=mid;
}
return tmp;
} int find(int l,int r,int val)
{
return max(findup(r,val)-finddown(l,val)+,);
} int query(int x,int y)
{
int ans=,a1,t1,t2;
if(pos[x]==pos[y]||pos[x]+==pos[y])
{
for(int i=x;i<=y;++i)mark[a[i]]++;
for(int i=x;i<=y;++i)
{
if(mark[a[i]]%==&&mark[a[i]]!=)ans++;
mark[a[i]]=;
}
return ans;
}
int l=L[pos[x]+],r=R[pos[y]-];
ans=f[pos[x]+][pos[y]-];
for(int i=x;i<=y;++i)
{
if(i==l)i=r+;
a1=a[i];if(mark[a1])continue;
t1=find(x,y,a1),t2=find(l,r,a1);
if(t1%==){
if(t2%!=||t2==)ans++;
}else if(t1%==){
if(t2%==&&t2!=)ans--;
}
mark[a1]=;
}
for(int i=x;i<l;++i)mark[a[i]]=;
for(int i=r+;i<=y;++i)mark[a[i]]=;
return ans;
} int main()
{
scanf("%d%d%d",&n,&c,&m);
blo=sqrt(n/log2(n));
for(int i=;i<=n;++i)scanf("%d",&a[i]),pos[i]=(i-)/blo+;
for(int i=;i<=pos[n];++i)L[i]=(i-)*blo+,R[i]=i*blo;
R[pos[n]]=n;
pre();
int ans=;
for(int i=,x,y;i<=m;++i)
{
scanf("%d%d",&x,&y);
x=(x+ans)%n+,y=(y+ans)%n+;
if(x>y)swap(x,y);
ans=query(x,y);
printf("%d\n",ans);
}
return ;
}

【分块】BZOJ2821 作诗(Poetize)的更多相关文章

  1. BZOJ2821 作诗(Poetize) 【分块】

    BZOJ2821 作诗(Poetize) Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI ...

  2. BZOJ2821 作诗(Poetize) 分块

    题意 算法 经验总结 代码 题意 不带修改,查询数列[1,n]中[l,r]内的出现正偶数次的数的个数, 数列中的数 <= 1e5, n <= 1e5, 强制在线 算法 ​ 查询的内容: 区 ...

  3. 2018.09.30 bzoj2821: 作诗(Poetize)(分块)

    传送门 分块经典题目. 先将数列分块. 然后预处理出每两个块之间有多少个数出现了正偶数次. 这样查询的时候对于中间的完整块直接用预处理出的数组搞定. 剩下的暴力枚举求解. 代码: #include&l ...

  4. BZOJ2821 作诗(Poetize) 主席树 bitset

    原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...

  5. bzoj2821: 作诗(Poetize)

    分块 分sqrt(n)块 F[i][j]表示块i到块j的答案 s[i][j]表示数字i在前j块内出现了几次 #include <iostream> #include <cstdio& ...

  6. BZOJ 2821: 作诗(Poetize)( 分块 )

    分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0 ...

  7. BZOJ_2821_作诗(Poetize)_分块

    BZOJ_2821_作诗(Poetize)_分块 Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要 ...

  8. 2821: 作诗(Poetize)

    2821: 作诗(Poetize) Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1078  Solved: 348[Submit][Status] ...

  9. 【BZOJ2821】作诗(Poetize) 分块

    Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...

随机推荐

  1. html5视频标签

    <video width="200" height="200" poster="img/shamo.jpg" src="vi ...

  2. 在应用中更新App版本号

    在应用中, 为了提高用户体验, 会提供更新版本号的功能. 那么怎样实现呢? 我写了一个简单的Demo, 说明一下, 须要注意几个细节. 使用了Retrofit和Rx处理网络请求. Github下载地址 ...

  3. hdu2993之斜率dp+二分查找

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. websocket简单实例

    只需要两个文件即可,一个服务端,一个前端,一下示例为模拟简单的聊天程序: 服务端: package com.test.websocket; import java.io.IOException; im ...

  5. iOS 多线程 之 GCD(大中枢派发)(一)

    导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...

  6. 将自己的域名代理到Gitpages

    相信有很多程序员都有自己的域名,甚至很多人还有自己的服务器.去年我也买了半年的阿里云,在tomcat里面发war包,相当于一个正式的项目.但是很多前端程序员应该要求很简单,就是能将静态的html发布就 ...

  7. 支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)

    CSV是一种十分简洁的数据结构,在DOTNET平台实际使用中发现微软官方并没有提供默认的方法,而网上好多例子发现实现并不严谨甚至一些含有明显错误,所以后面自己实现了一个读写工具类,这里发出来希望方便后 ...

  8. bzoj 3531: [Sdoi2014]旅行

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...

  9. nginx搭建rtmp协议流媒体服务器总结

    最近在 ubuntu12.04+wdlinux(centos)上搭建了一个rtmp服务器,感觉还挺麻烦的,所以记录下. 大部分都是参考网络上的资料. 前提: 在linux下某个目录中新建一个nginx ...

  10. 记vue API 知识点

    1. v-cloak指令:这个指令保持在元素上直到关联实例结束编译.和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标 ...