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. 一道题Wrong Answer之后该何去何从?

    写程序手不稳是个大毛病,往往会让一份能AC的代码变成99.995%正确,失之毫厘谬以千里,近期十场个人赛非常少有能一次AC的经历,细致想想除了根本逻辑上的错误.大概都是跪在这些细节上: 1.输出格式, ...

  2. Java深入 - MyBatis的经常用法

    MyBatis我们这篇文章主要记录一些经常使用的操作方法.这样在开发和使用的过程中这篇文章能够当做工具书来使用. MyBatis的数据源配置 <bean id="dataSource& ...

  3. 【quickhybrid】H5和原生的职责划分

    前言 在JSBridge实现后,前端网页与原生的交互已经通了,接下来就要开始规划API,明确需要提供哪一些功能来供前端调用. 但是在这之前,还有一点重要工作需要做: 明确H5与Native的职责划分, ...

  4. 自学Zabbix1.2-zabbix特性

    Zabbix是一个高度集成的网络监控套件,通过一个软件包即可提供如下特性. 概述 Zabbix是一个高度集成的网络监控套件,通过一个软件包即可提供如下特性 数据收集 可用性及性能检测 支持SNMP(t ...

  5. 【python】type()、instance()

    >>> a=520 >>> type(a) <class 'int'> >>> a=' >>> type(a) &l ...

  6. ios学习——键盘的收起

    在开发过程中,我们经常会用到UITextField.UITextView等文本框,然后这些文本框在点击之后会自动成为第一响应者(FirstResponder),并自动弹出软键盘.然而,没有自动定义好的 ...

  7. Java并发编程之ThreadLocal源码分析

    ## 1 一句话概括ThreadLocal<font face="微软雅黑" size=4>  什么是ThreadLocal?顾名思义:线程本地变量,它为每个使用该对象 ...

  8. ArcGIS API for JavaScript 4.2学习笔记[19] 搜索小部件——使用更多数据源

    上一篇中提到,空间搜索小部件是Search这个类的实例化,作为视图的ui属性添加进去后,视图就会出现搜索框了. 这节的主体代码和上篇几乎一致,区别就在上篇提及的sources属性. 先看看结果: 由于 ...

  9. Tensorflow之MNIST机器学习入门

    MNIST机器学习的原理: 通过一次次的 输入某张图片的像素值(用784维向量表示)以及这张图片对应的数字(用10维向量表示比如数字1用[0,1,0,0,0,0,0,0,0,0]表示),来优化10*7 ...

  10. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)

    一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面 ...