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 - 苏煜<对块状链表的一 ...
随机推荐
- RPM包效验
- 从零开始学习前端开发 — 6、CSS布局模型
一.css布局模型 1.流动模型(Flow) 元素在不设置css样式时的布局模型,是块元素就独占一行,是内联元素就在一行逐个进行显示 2.浮动模型(Float) 使用float属性来进行网页布局,给元 ...
- 数据库 MySQL基础知识
(关于MySQL的安装,具体见下面博客:http://www.cnblogs.com/wj-1314/p/7573242.html) 一.什么是数据库 ? 数据库是按照数据结构来组织,存储和管理数据的 ...
- TP框架自带的正则验证的规则
thinkphp框架里面自带有很多自动验证的规则,下面是框架自带的正则验证的规则,官方的说明文档里面没有这么多,所以记下来,以备使用. view sourceprint? 01 static $reg ...
- nginx重启报找不到nginx.pid的解决方法
nginx被停止(nginx -s stop)或者直接杀掉了进程(kill -9 nginx的进程号)后,调用命令(nginx -s reload 或者 nginx -s reopen)会报错:无法找 ...
- CSAPP 第二章随笔
类型转换问题 (1)int -> short 二进制位高位截断,低位保持不变 (2)同类型 unsign -> sign 记住二进制位是不变的 (3)P101页提到的编译器乘法优化问题,一 ...
- 苹果新贵 Swift 之前世今生
摘要 : 做为一个70后程序员,克里斯先后发明了 LLVM.Clang 和 Swift,请问你做了什么? 上 周出差劳顿,这篇文章几次动笔都未完成,常常躺倒床上就昏睡过去.南方的天气闷热潮湿,让我 ...
- Spring Boot实战:拦截器与过滤器
一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...
- js双向绑定和地址传递带来的痛苦解决方案之对象拷贝
function cloneObj(obj) { var newObj = {}; if (obj instanceof Array) { newObj = []; } for (var key in ...
- duilib消息类型
//定义所有消息类型 ////////////////////////////////////////////////////////////////////////// #define DUI_MS ...