CF 455D. Serega and Fun [分块 deque]
题意:
[l,r]循环右移一位,查询区间内某个数出现次数
为什么好多人用链表?反正我是不会写双向链表
完全可以分块然后模拟啊...中间的块只会插入删除一个元素呀....用deque就好了
虽然说deque常数大但是CF上标准库快啊
不用deque怎么做?可以每个块开一个$O(S)$大小的数组,然后每$S$个操作重建一次
一个非常奇怪的事情是$S=n^0.618$比$n^0.5$快了4倍多...300多ms
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <deque>
using namespace std;
typedef long long ll;
const int N=1e5+,M=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,Q,op,a[N]; int block,pos[N],m;
struct _Blo{int l,r,c[N];}b[M];
deque<int> q[M];
deque<int>::iterator it;
void ini(){
block=pow(n,0.618);
m=(n-)/block+;
for(int i=;i<=n;i++) pos[i]=(i-)/block+;
for(int i=;i<=m;i++) b[i].l=(i-)*block+, b[i].r=i*block;
b[m].r=n;
} struct Block{
void Set(int x){
for(int i=b[x].l ; i<=b[x].r ; i++) q[x].push_back(a[i]), b[x].c[a[i]]++;
}
void Cha(int l,int r){
int pl=pos[l],pr=pos[r];
int f= l-b[pl].l , g= r-b[pr].l , x=q[pr][g];
if(pl==pr){
q[pr].erase( q[pr].begin()+g ); q[pl].insert( q[pl].begin()+f , x );
}else{
q[pl].insert( q[pl].begin()+f , x ); b[pl].c[x]++;
q[pr].erase( q[pr].begin()+g); b[pr].c[x]--; for(int i=pl;i<pr;i++){
int x=q[i].back();
q[i].pop_back(); b[i].c[x]--;
q[i+].push_front(x); b[i+].c[x]++;
}
}
}
int Que(int l,int r,int k){
int pl=pos[l],pr=pos[r];
int f= l-b[pl].l , g= r-b[pr].l;
int ans=;
if(pl==pr){
for(int i=f ; i<=g ; i++) ans+= q[pl][i]==k;
}else{
for(int i=f ; i<(int)q[pl].size() ; i++) ans+= q[pl][i]==k;
for(int i= ; i<=g ; i++) ans+= q[pr][i]==k;
for(int i=pl+ ; i<pr ; i++) ans+= b[i].c[k];
}
return ans;
}
}B;
int main(){
//freopen("in","r",stdin);
n=read(); ini();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=m;i++) B.Set(i); Q=read(); int last=,l,r;
while(Q--){
op=read();
l=( read()+last- )%n+, r=( read()+last- )%n+;
if(l>r) swap(l,r);
if(op==) B.Cha(l,r);
else{
int k=( read()+last- )%n+;//printf("k %d\n",k);
last=B.Que(l,r,k);
printf("%d\n",last);
}
}
}
CF 455D. Serega and Fun [分块 deque]的更多相关文章
- 分块+deque维护 Codeforces Round #260 (Div. 1) D. Serega and Fun
D. Serega and Fun time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces Round #260 (Div. 1) D. Serega and Fun 分块
D. Serega and Fun Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/pro ...
- CF 86D Powerful array 【分块算法,n*sqrt(n)】
给定一个数列:A1, A2,……,An,定义Ks为区间(l,r)中s出现的次数. t个查询,每个查询l,r,对区间内所有a[i],求sigma(K^2*a[i]) 离线+分块 将n个数分成sqrt(n ...
- CF 551E. GukiZ and GukiZiana [分块 二分]
GukiZ and GukiZiana 题意: 区间加 给出$y$查询$a_i=a_j=y$的$j-i$最大值 一开始以为和论文CC题一样...然后发现他带修改并且是给定了值 这样就更简单了.... ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- splay训练
1, CF 455D 2, CF 420D 3, CF 414E
- Serega and Fun CodeForces - 455D (分块 或 splay)
大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...
- CodeForces 455D 分块
题目链接:http://codeforces.com/problemset/problem/455/D 题意:给定一个长度为n的序列a[]. m次操作.共有两种操作 1 l r:将序列的a[l].a[ ...
- CF 13E. Holes 分块数组
题目:点这 跟这题BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 一模一样 分析: 分块数组入门题. 具体的可以学习这篇博文以及做国家集训队2008 - 苏煜<对块状链表的一 ...
随机推荐
- Xshell无法连接到LINUX虚拟机
首先与遇到的情况是,在虚拟机下安装了Linux后,xshell无法连接远程的虚拟机. 我遇到的情况是虚拟机可以ping 主机,主机确ping不了虚拟机. 使用的VM设置了两个网卡,一个nat 一个h ...
- c++(单词统计)
在面试环节中,有一道题目也是考官们中意的一道题目:如果统计一段由字符和和空格组成的字符串中有多少个单词? 其实,之所以问这个题目,考官的目的就是想了解一下你对状态机了解多少. (1) 题目分析 从题目 ...
- Thinking in Java学习笔记-泛型和类型安全的容器
示例: public class Apple { private static long counter; private final long id = counter++; public long ...
- Vue中的$set的使用
在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去: 当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新 ...
- 用adb命令查看apk版本
adb devices (显示连接的设备) adb root (获取手机root权限) adb remount (重新挂载系统分区,使系统分区重新可写) adb shell (进入目标设备的L ...
- 认识Java(2)
注释 对程序的一段文字描述 可方便其他用户的阅读,增加代码的可读性.可以注销掉代码,等需要的时候再用. 编译器会自动忽视被注释的内容. 分类: 单行注释 // 多行注释 /* */ 文档注释/** * ...
- spring-mvc整合jquery cropper图片裁剪插件
参考网址:http://blog.csdn.net/u012759397/article/details/53126522
- 如何从零开始设计一款漂亮的移动APP?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 我13岁时开始学习平面设计.我从网上课程学会了设计网站,并习惯于全天使用Photoshop和Affi ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- node 在控制台打印有色彩的输出
在学习 node 过程中,因为没有找到有断点的调试方法,只能退而次之,在控制台打印调试. 但整个控制台的输出都是一种颜色,有时候很难找到自己需要的信息,这时,有颜色的打印就会帮上很大的忙. conso ...