【分块】P4135 作诗
分块太暴力惹...
没做出来。看了题解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 作诗的更多相关文章
- 洛谷P4135 作诗 (分块)
洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...
- P4135 作诗——分块
题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...
- 洛谷 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< ...
- 洛谷 P4135 作诗 题解
题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...
随机推荐
- 【latex】latex基础
文档边距.间距调整 边距调整 \usepackage{geometry} %设置页边距的宏包 \geometry{left=3.0cm,right=2.5cm,top=2.5cm,bottom=2.5 ...
- mac 安装配置使用 mongoldb
mac 安装配置使用 mongoldb 安装和配置 brew install mongos brew install mongo # 密码就是用户的密码 # 配置数据文件 //如果不配置会出现错误62 ...
- LeetCode 620. Not Boring Movies (有趣的电影)
题目标签: 题目给了我们一个 cinema 表格, 让我们找出 不无聊的电影,并且id 是奇数的,降序排列. 比较直接简单的,具体看code. Java Solution: Runtime: 149 ...
- 安装mongo
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_40101530/articl ...
- C++数据类型之字符串类型&布尔类型&数据的输入
字符串型 **作用**:用于表示一串字符 **两种风格** 1. **C风格字符串**: char 变量名 [ ] = "字符串值" 2.**C++风格字符串**: stri ...
- USACO 2008 January Silver Telephone Lines /// 二分最短路 邻接表dijkstra oj22924
题目大意: 一共有N (1 ≤ N ≤ 1,000)个电线杆,有P P (1 ≤ P ≤ 10,000)对电线杆是可以连接的, 用几条线连接在一起的电线杆之间都可相互通信,现在想要使得电线杆1和电线杆 ...
- HTML_表单标签
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)
1.什么是RabbitMQ工作队列 我们在应用程序使用消息系统时,一般情况下生产者往队列里插入数据时速度是比较快的,但是消费者消费数据往往涉及到一些业务逻辑处理导致速度跟不上生产者生产数据.因此如果一 ...
- npm 安装vue 报错Failed at the chromedriver@2.46.0 install script 'node install.js'
原因一般是下载源被封了,我们连接淘宝的下载源下载: npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/d ...
- js数学公式-曲线运动
---勾股定理 a*a + b*b =c*c ---三角函数 正弦 : sin 余弦 : cos 正切 : tan 余切 : cot 正弦定理 a/sinA = b/sinB =c/sinC = 2r ...