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. iOS 力学动画生成器UIKit Dynamics 之碰撞效果解说

    UIKit Dynamic是iOS7 新增的一组类和方法.可赋予UIView逼真的行为和特征,不须要写动画效果那些繁琐的代码,让开发者可以轻松地改善应用的用户体验.一共同拥有6个可用于定制UIDyna ...

  2. xml基本语法(2)

    本节要点: 了解XML的文档声明 了解XML的元素.命名规则.属性.元素内容.处理指令等概念 1 XML文档声明 表示该文档是一个XML文档,以及遵循哪个XML版本的规范. 规范:<?xml 版 ...

  3. Spring学习笔记(三)之装配Bean

    除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...

  4. Win32界面 主函数分析

    WinMain即(函数运行入口): p { margin-bottom: 0.25cm; line-height: 120% } int WINAPI WinMain (HINSTANCE hinst ...

  5. 阿里云服务器(windows server2008)下安装SVN----杜恩德

    我想说的是如何在阿里云上建立SVN版本,供外网访问,上传代码 在阿里云服务器上安装svn与在本地安装是一样的, ----参考 http://blog.csdn.net/m0_37027631/arti ...

  6. 微信小程序教学第四章第三节(含视频):小程序中级实战教程:详情-功能完善

    详情 - 功能完善 本文配套视频地址: https://v.qq.com/x/page/f0555nfdi14.html 开始前请把 ch4-3 分支中的 code/ 目录导入微信开发工具 这一节中, ...

  7. 老生常谈之Block

    前面有一篇介绍Block的博客,主要介绍了Block的简单使用技巧.这篇博客主要更加深入地了解一下Block.包括:Block的实现.__Block的原理以及Block的存储域三方面. Block的实 ...

  8. JAVA NIO学习一:NIO简介、NIO&IO的主要区别

    在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...

  9. BCryptPasswordEncoder加密及判断密码是否相同

    项目中用到了BCryptPasswordEncoder对密码进行二次加密,需要注意的是,加密后的字符串比较长,数据库的长度至少为60位. 通过BCryptPasswordEncoder的加密的相同字符 ...

  10. 破解iframe微信推文(图片)防盗链

    $.ajaxPrefilter(function(options) { if(options.crossDomain && jQuery.support.cors) { var htt ...