P4135 作诗——分块
题目:https://www.luogu.org/problemnew/show/P4135
分块大法;
块之间记录答案,每一块记录次数前缀和;
注意每次把桶中需要用到位置赋值就好了;
为什么加了特判会 T 一个点?
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int const maxn=1e5+;
int n,c,m,mod,a[maxn],ans,blk[maxn],base,t[maxn],cnt[][maxn],bst[],bed[],f[][];
void pre(int x)
{
int tmp=,tem=x;
memset(t,,sizeof t);
for(int i=bst[x];i<=n;i++)
{
t[a[i]]++;
if(t[a[i]]%==)tmp++;
else if(t[a[i]]>)tmp--;
if(i==bed[tem])f[x][tem]=tmp,tem++;
}
}
int main()
{
scanf("%d%d%d",&n,&c,&m);
base=sqrt(n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),blk[i]=(i-)/base+;
for(int i=;i<=blk[n];i++)bst[i]=(i-)*base+,bed[i]=min(n,i*base);
for(int i=;i<=blk[n];i++)pre(i);
for(int i=;i<=blk[n];i++)
{
for(int k=;k<=c;k++)cnt[i][k]=cnt[i-][k];
for(int j=bst[i];j<=bed[i];j++)cnt[i][a[j]]++;
}
for(int i=,l,r;i<=m;i++)
{
scanf("%d%d",&l,&r);
l=(l+ans)%n+; r=(r+ans)%n+;
if(l>r)swap(l,r);
// if(l==r){printf("0\n"); ans=0; continue;}//ans=0!!! //加特判变慢了???
ans=;
if(blk[l]==blk[r])
{
for(int j=l;j<=r;j++)t[a[j]]=;
for(int j=l;j<=r;j++)
{
t[a[j]]++;
if(t[a[j]]%==)ans++;
else if(t[a[j]]>)ans--;
}
printf("%d\n",ans);
}
else
{
if(blk[r]>blk[l]+)ans=f[blk[l]+][blk[r]-];
for(int j=l;j<=bed[blk[l]];j++)t[a[j]]=cnt[blk[r]-][a[j]]-cnt[blk[l]][a[j]];
for(int j=bst[blk[r]];j<=r;j++)t[a[j]]=cnt[blk[r]-][a[j]]-cnt[blk[l]][a[j]];
for(int j=l;j<=bed[blk[l]];j++)
{
t[a[j]]++;
if(t[a[j]]%==)ans++;
else if(t[a[j]]>)ans--;
}
for(int j=bst[blk[r]];j<=r;j++)
{
t[a[j]]++;
if(t[a[j]]%==)ans++;
else if(t[a[j]]>)ans--;
}
printf("%d\n",ans);
}
}
return ;
}
P4135 作诗——分块的更多相关文章
- 洛谷P4135 作诗 (分块)
洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...
- 【分块】P4135 作诗
分块太暴力惹... 没做出来.看了题解qaq 分析: 两头$\sqrt{n}$暴力维护 预处理ans[i][j],sum[i][j] sum[i][j]是一个前缀和,前i块值为j的数量 ans[i][ ...
- 洛谷 P4135 作诗(分块)
题目链接 题意:\(n\) 个数,每个数都在 \([1,c]\) 中,\(m\) 次询问,每次问在 \([l,r]\) 中有多少个数出现偶数次.强制在线. \(1 \leq n,m,c \leq 10 ...
- 洛谷P4135 作诗(不一样的分块)
题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l, ...
- 洛谷P4135 作诗
题意:[l,r]之间有多少个数出现了正偶数次.强制在线. 解:第一眼想到莫队,然后发现强制在线...分块吧. 有个很朴素的想法就是蒲公英那题的套路,做每块前缀和的桶. 然后发现这题空间128M,数组大 ...
- luogu P4135 作诗
嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气. 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i ...
- P4135 作诗
传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...
- 洛谷 P4135 作诗
分块大暴力,跟区间众数基本一样 #pragma GCC optimize(3) #include<cstdio> #include<algorithm> #include< ...
- [BZOJ2821]作诗(分块)
题意 N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次对于100%的数据,1≤n,c,m≤105 题解 (传说lyd省选的时候看错题 把题看成这个了 从此又多了一道分块神题)把N个数 ...
随机推荐
- Hive扩展功能(八)--表的索引
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...
- 我的liunx开发环境的配置之路
相信有不少人和我一样,虽然是做纯linux开发,但并不排斥windows,并且喜欢在windows下面的使用各种好用的工具来让linux的编程工作变得更加方便.实际上每一个系统都有他的过人支持,win ...
- 转录组入门(3):了解fastq测序数据
sra文件转换为fastq格式 fastq-dump -h --split-3 也就是说如果SRA文件中只有一个文件,那么这个参数就会被忽略.如果原文件中有两个文件,那么它就会把成对的文件按*_1.f ...
- Cesium学习笔记(四)Camera ----http://blog.csdn.net/hobhunter/article/details/74909641
Cesium 相机控制场景中的视野.操作相机的方法有很多,如旋转,缩放,平移和飞到目的地.Cesium具有默认的鼠标和触摸事件处理程序与相机进行交互,还有一个API以编程方式操纵相机. 我们可以使用该 ...
- 如何从源码启动和编译IoTSharp
IoTSharp 项目是一个开源物联网平台,数据库使用PostgreSQL , 后端使用 Asp.Net Core 2.2 ,前端使用 vue-element-admin , 下面我们介绍如何启动项 ...
- Linux培训时长多久可以学会?马哥教育9年经验之谈
在Linux的热潮下,很多人萌发了学习Linux的想法.比起自学,培训是一个能够快速.系统的掌握知识的方式,也受到了不少人的青睐. 很多人都想知道通过培训学习Linux需要多长时间,今天咱们就来盘点一 ...
- mysql命令整理
MySQL大小写通用. 一.常见用的mysql指令 1.show databases; #查看当前所有库 2.show tables; #查看所在库中的所有表 3.use 库名; #进入该库 4.sh ...
- selenium等待
简介 在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完成以后, 才会将操作权限在交给我们的程序. 但是,由于ajax和各种JS代码的异步加载问题,当一个页面被 ...
- Java基础学习总结(70)——开发Java项目常用的工具汇总
要想全面了解java开发工具,我们首先需要先了解一下java程序的开发过程,通过这个过程我们能够了解到java开发都需要用到那些工具. 首先我们先了解完整项目开发过程,如图所示: 从上图中我们能看到一 ...
- JavaSE 学习笔记之StringBuffer(十五)
--< java.lang >-- StringBuffer字符串缓冲区: 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符. 特点: 1:可以对字符串内容进行修改. 2:是一 ...