2018.09.30 bzoj2821: 作诗(Poetize)(分块)
传送门
分块经典题目。
先将数列分块。
然后预处理出每两个块之间有多少个数出现了正偶数次。
这样查询的时候对于中间的完整块直接用预处理出的数组搞定。
剩下的暴力枚举求解。
代码:
#include<bits/stdc++.h>
#define N 100005
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,c,m,a[N],lastans,blo[N],cnt[N],cal[255][N],sum[255][255],sig=500,blos;
inline int query(int ql,int qr){
int l=blo[ql],r=blo[qr],ret=0;
if(r-l<2){
for(int i=ql;i<=qr;++i){
++cnt[a[i]];
if(!(cnt[a[i]]&1))++ret;
else if(cnt[a[i]]>2)--ret;
}
for(int i=ql;i<=qr;++i)--cnt[a[i]];
return ret;
}
ret+=sum[l+1][r-1];
for(int i=ql;i<=l*sig;++i){
++cnt[a[i]];
int tmp=cnt[a[i]]+cal[r-1][a[i]]-cal[l][a[i]];
if(!(tmp&1))++ret;
else if(tmp>2)--ret;
}
for(int i=(r-1)*sig+1;i<=qr;++i){
++cnt[a[i]];
int tmp=cnt[a[i]]+cal[r-1][a[i]]-cal[l][a[i]];
if(!(tmp&1))++ret;
else if(tmp>2)--ret;
}
for(int i=ql;i<=l*sig;++i)--cnt[a[i]];
for(int i=(r-1)*sig+1;i<=qr;++i)--cnt[a[i]];
return ret;
}
int main(){
n=read(),c=read(),m=read();
for(int i=1;i<=n;++i)++cal[(blo[i]=(i-1)/sig+1)][(a[i]=read())];
blos=blo[n];
for(int i=1;i<=c;++i)for(int j=1;j<=blos;++j)cal[j][i]+=cal[j-1][i];
for(int i=1;i<=blos;++i){
int tmp=0;
for(int j=(i-1)*sig+1;j<=n;++j){
++cnt[a[j]];
if(!(cnt[a[j]]&1))++tmp;
else if(cnt[a[j]]>2)--tmp;
sum[i][blo[j]]=tmp;
}
for(int j=(i-1)*sig+1;j<=n;++j)--cnt[a[j]];
}
while(m--){
int l=(read()+lastans)%n+1,r=(read()+lastans)%n+1;
if(l>r)swap(l,r);
printf("%d\n",lastans=query(l,r));
}
return 0;
}
2018.09.30 bzoj2821: 作诗(Poetize)(分块)的更多相关文章
- BZOJ2821 作诗(Poetize) 分块
题意 算法 经验总结 代码 题意 不带修改,查询数列[1,n]中[l,r]内的出现正偶数次的数的个数, 数列中的数 <= 1e5, n <= 1e5, 强制在线 算法 查询的内容: 区 ...
- BZOJ2821 作诗(Poetize) 【分块】
BZOJ2821 作诗(Poetize) Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
- 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 ...
- 【BZOJ2821】作诗(Poetize) 分块
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
- BZOJ2821 作诗(Poetize) 主席树 bitset
原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...
- bzoj2821: 作诗(Poetize)
分块 分sqrt(n)块 F[i][j]表示块i到块j的答案 s[i][j]表示数字i在前j块内出现了几次 #include <iostream> #include <cstdio& ...
- BZOJ2821 作诗(分块)
和区间众数几乎一模一样的套路. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include&l ...
- BZOJ 2821作诗(Poetize) 分块
Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...
随机推荐
- SpringMVC + Mybatis 多数据源配置
比较常用的配置,多数据源.主从等等. 大概的逻辑是: 1.spring-mybatis.xml中配置多个数据源 2.使用Spring提供的AbstractRoutingDataSource类来根据请求 ...
- UI5-文档-2-开发环境
这一部分将指导您安装.配置和设置SAPUI5开发环境的最常见和推荐用例. 请注意:您可以在不同的平台上使用SAPUI5.各自平台的许可和维护条件也适用于SAPUI5.例如,如果在SAP云平台上使用SA ...
- vue深入了解组件——插槽
一.插槽内容 Vue实现了一套内容分发的API,这套API基于当前的Web Components规范草案,将 <slot> 元素作为承载分发的内容的出口. 它允许你像这样合成组件: &l ...
- rem 响应 js函数
size();window.onresize = function(){ size();}function size(){ var htnl_o=document.getElementsByTagNa ...
- Hibernate 的事物简单的增删查改
Hibernate 是一个优秀的ORM框架体现在: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管 ...
- JDBC连接数据库创建连接对象
1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String classN ...
- JAVA数据类型(转载)
JAVA中值类型的只有short,char,byte,int,long,double,float,boolean八大基本类型,其他的所有类型都是引用类型. 首先我们都知道在编程中赋值运算“=”的意思是 ...
- spring中的BeanFactory和FactoryBean的区别与联系
首先,这俩都是个接口… 实现 BeanFactory 接口的类表明此类是一个工厂,作用就是配置.新建.管理 各种Bean. 而 实现 FactoryBean 的类表明此类也是一个Bean,类型为工厂B ...
- linux kernel 的配置及编译
1. 执行make menuconfig 配置内核 2. 执行make zImage 编译内核 3. 执行make modules 编译模块 4. 内核源代码的配置及编译系统 Makefile Kco ...
- 给vim编辑器自动添加行号
1.只改变当前用户的vim 在~目录下 vim .vimrc添加一行 set number 即可(普通用户权限即可) 2. 改变所有用户的vim 打开文件 /etc/vimrc 添加一行 set n ...