分块太暴力惹...

没做出来。看了题解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二次开发-NX11创建表达式组NXOpen::ExpressionGroup

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> #include < ...

  2. Windows内存管理(2)--Lookaside结构 和 运行时函数

    1.      Lookaside结构 频繁的申请和回收内存,会导致在内存上产生大量的内存"空洞",从而导致最终无法申请内存.DDK为程序员提供了Lookaside结构来解决这个问 ...

  3. CSS3:CSS3 渐变(Gradients)

    ylbtech-CSS3:CSS3 渐变(Gradients) 1.返回顶部 1. CSS3 渐变(Gradients) CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳 ...

  4. 创建第一个spirngmvc小项目

    题外: 设置目录为源代码目录 1.进入:file->project structure->modules->soures 进入这个里面,选择相应的文件夹.例如src/java里的ja ...

  5. 1-MySQL高级-视图

    视图 1. 问题 对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦 解决办法:定义 ...

  6. 2018今日头条湖北省赛【A】

    [题目链接]https://www.nowcoder.com/acm/contest/104/A 这题就是很简单的几何题..md现场推了很久的cos sin仿佛像个zz.自己都想给自己一巴掌. 题意就 ...

  7. scrapy不抓取重复的网页解决办法

    1.scrapy爬虫遇到一个问题,有时候会对一个网页重复爬取提取不同的数据,这时候会发现,后面的那个重复爬取scrapy直接终止了. 原因: scrapy 的request逻辑里面  dont_fil ...

  8. RDD运行原理

  9. yum 安装rpmbuild命令

    yum install -y rpm-build [root@zhu2 bin]# rpm -qf rpmbuildrpm-build-4.8.0-27.el6.x86_64

  10. 1分钟k线图能反映什么?(转)

    对于投资者特别是短线操作者来讲,应该重视1分钟K线图,但是并不是所有的股票都能通过1分钟K线图看出名堂来,比如一些小盘股,盘子较轻,很容易上蹿下跳.仅用1分钟K线图分析其上证指数,很难研判大盘当日的高 ...