分块太暴力惹...

没做出来。看了题解qaq

分析:

两头$\sqrt{n}$暴力维护

预处理ans[i][j],sum[i][j]

sum[i][j]是一个前缀和,前i块值为j的数量

ans[i][j]表示第i块到第j块的答案总和

询问的时候先做两头,最后把ans[][]加上去就好了!

主要难点在预处理和卡常

 #pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}const int M=1e5+,N=;
int sum[N][M],ans[N][N],n,c,m,x,y,bl[M],k,a[M],cnt[M],lst,tmp,i,j,now;
int Query(int l,int r){
tmp=;
if(bl[l]==bl[r]){
for(i=l;i<=r;++i){
++cnt[a[i]];
if(!(cnt[a[i]]&)) ++tmp;
else if(cnt[a[i]]>) --tmp;
}for(i=l;i<=r;i++) --cnt[a[i]];
return tmp;
}else{
for(i=l;i<=bl[l]*k;++i){
++cnt[a[i]];
if(!((cnt[a[i]]+sum[bl[r]-][a[i]]-sum[bl[l]][a[i]])&)) ++tmp;
else if(cnt[a[i]]+sum[bl[r]-][a[i]]-sum[bl[l]][a[i]]>) --tmp;
}
for(i=(bl[r]-)*k+;i<=r;i++){
++cnt[a[i]];
if(!((cnt[a[i]]+sum[bl[r]-][a[i]]-sum[bl[l]][a[i]])&)) ++tmp;
else if(cnt[a[i]]+sum[bl[r]-][a[i]]-sum[bl[l]][a[i]]>) --tmp;
}
for(i=l;i<=bl[l]*k;i++) --cnt[a[i]];
for(i=(bl[r]-)*k+;i<=r;i++) --cnt[a[i]];
tmp+=ans[bl[l]+][bl[r]-];
return tmp;
}
}
signed main(){
n=read(),c=read(),m=read();k=sqrt(n)+;
for(i=;i<=n;++i) a[i]=read();
for(i=;i<=n;++i) bl[i]=(i-)/k+,++sum[bl[i]][a[i]];
for(i=;i<=bl[n];++i)for(j=;j<=c;++j)sum[i][j]+=sum[i-][j];
for(i=;i<=bl[n];++i){
for(j=(i-)*k+,now=;j<=n;++j){
cnt[a[j]]++;
if(!(cnt[a[j]]&)) ++now;
else if(cnt[a[j]]>) --now;
ans[i][bl[j]]=now;
}for(j=i*k-k+;j<=n;++j)--cnt[a[j]];
}while(m--){
x=read(),y=read(),x=(x+lst)%n+,y=(y+lst)%n+;
if(x>y) swap(x,y);
printf("%d\n",lst=Query(x,y));
}return ;
}

【分块】P4135 作诗的更多相关文章

  1. 洛谷P4135 作诗 (分块)

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

  2. P4135 作诗——分块

    题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...

  3. 洛谷 P4135 作诗(分块)

    题目链接 题意:\(n\) 个数,每个数都在 \([1,c]\) 中,\(m\) 次询问,每次问在 \([l,r]\) 中有多少个数出现偶数次.强制在线. \(1 \leq n,m,c \leq 10 ...

  4. 洛谷P4135 作诗(不一样的分块)

    题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l, ...

  5. 洛谷P4135 作诗

    题意:[l,r]之间有多少个数出现了正偶数次.强制在线. 解:第一眼想到莫队,然后发现强制在线...分块吧. 有个很朴素的想法就是蒲公英那题的套路,做每块前缀和的桶. 然后发现这题空间128M,数组大 ...

  6. luogu P4135 作诗

    嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气. 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i ...

  7. P4135 作诗

    传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...

  8. 洛谷 P4135 作诗

    分块大暴力,跟区间众数基本一样 #pragma GCC optimize(3) #include<cstdio> #include<algorithm> #include< ...

  9. 洛谷 P4135 作诗 题解

    题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...

随机推荐

  1. NX二次开发-NXOpen获取边的端点NXOpen::Edge::GetVertices

    NX9+VS2012 #include <NXOpen/Features_BlockFeatureBuilder.hxx> #include <NXOpen/Features_Fea ...

  2. JsJquery小技巧

    JS对URL编码 :encodeURI() .Net对URL解码:HttpUtility.UrlDecode() 格式化输出百分数 function formatePercent(data){     ...

  3. 谈谈E语言

    基于中国文化底蕴的编程语言,  绝对不是E语言那个样子. 基于中文的编程,必将是计算机届的一次原子爆炸!

  4. NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏

    #include<iostream> #include<string> #include<stack> #include<cstdio> using n ...

  5. [00]APUE:GCC / GDB / Makefile

    http://blog.csdn.net/haoel/article/category/9197 http://blog.csdn.net/haoel/article/details/2886  生成 ...

  6. 利用zk客户端删除solr shard

    进入zk客户端 ./bin/zkCli.sh -server ip:2181 显示所有的内容: ls / 删除数据: rmr /filename path

  7. Win7+Ubuntu11.10(EasyBCD硬盘安装)----转载

    Win7+Ubuntu11.10(EasyBCD硬盘安装) ubuntu 下载地址:http://mirrors.163.com/ubuntu-releases/12.04/ 1)首先还是分区,在计算 ...

  8. 使Excel中单元格内英文为Arial Narrow 中文为宋体显示打印

    因为在对数据表进行排版格式整理的时候,发现Arial Narrow字体是不支持中文的,所以中文默认为宋体,但是显示出来却不是宋体,需要双击单元格中文才显示为宋体,这样打印出来才为宋体 但是如果有很多单 ...

  9. (二十三)Http请求的处理过程

  10. ubuntu自带截图工具

    ubuntu自带的截图工具感觉能够满足基本的截图功能,可以不必安装另外的截图软件. 一般用到的截图类型有三种:全屏.当前活动窗口.自定义区域,其中自定义区域截图是最灵活也是我们用的最多的方式.在ubu ...