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. POJ3621 Sightseeing Cows(最优比率环)

    题目链接:id=3621">http://poj.org/problem?id=3621 在一个有向图中选一个环,使得环上的点权和除以边权和最大.求这个比值. 经典的分数规划问题,我认 ...

  2. inline-block解决

    一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距 二.方法之移除空格 元素间留白间距出现的原因就是标签段之间的空格,因此,去掉HTML中的空格,自 ...

  3. All-In-One方式-安装openstack

    ALL-IN-ONE安装openstack******************************************************************************* ...

  4. 配置SQL Server on Linux(1)

    1. 背景 SQL Server一般是在安装过程中进行相关的配置,安装完成之后,再去修改有一些配置就比较麻烦,比如更改SQL Server实例级别的排序规则.但在Linux下,安装过程并没有很多可以配 ...

  5. 手把手教你用vue-cli搭建vue项目

    手把手教你用vue-cli搭建vue项目 本篇主要是利用vue-cli来搭建vue项目,其中前提是node和npm已经安装好,文章结尾将会简单提到一个简单的例子.使用vue-cli搭建项目最开始我也是 ...

  6. 小白的Python之路 day1 数据类型,数据运算

    一.数据类型初识 1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j ...

  7. JavaWeb之数据源连接池(2)---C3P0

    我们接着<JavaWeb之数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3 ...

  8. 完善chrome翻译插件ChaZD,支持有道智云api

    首先放上该项目的github地址:https://github.com/codethereforam/ChaZD 之前想找一个chrome支持划词翻译的插件,最终在知乎上看到了这个回答,推荐的是Cha ...

  9. 微信JS-SDK使用步骤(以微信扫一扫为例)

    概述: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ...

  10. 3.sass的数据类型与函数

    数据类型 在sass里有数字.字符串.列表.颜色等类型 在cmd里 输入 sass -i 就会进入到交互模式,输入的计算可以马上得到结果 type-of()可以用来得到数据类型,如: type-of( ...