Serega and Fun

题意:

[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]的更多相关文章

  1. 分块+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 ...

  2. 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 ...

  3. 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 ...

  4. CF 551E. GukiZ and GukiZiana [分块 二分]

    GukiZ and GukiZiana 题意: 区间加 给出$y$查询$a_i=a_j=y$的$j-i$最大值 一开始以为和论文CC题一样...然后发现他带修改并且是给定了值 这样就更简单了.... ...

  5. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  6. splay训练

    1, CF 455D 2, CF 420D 3, CF 414E

  7. Serega and Fun CodeForces - 455D (分块 或 splay)

    大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...

  8. CodeForces 455D 分块

    题目链接:http://codeforces.com/problemset/problem/455/D 题意:给定一个长度为n的序列a[]. m次操作.共有两种操作 1 l r:将序列的a[l].a[ ...

  9. CF 13E. Holes 分块数组

    题目:点这 跟这题BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊  一模一样 分析: 分块数组入门题. 具体的可以学习这篇博文以及做国家集训队2008 - 苏煜<对块状链表的一 ...

随机推荐

  1. 使用npm install报错-4048 operation not permitted解决

    刚刚使用npm install时一直报错-4048 operation not permitted,也尝试了多种方法,终于使问题得到解决,这里总结几种方法,先贴图: 一:权限问题 首先看到operat ...

  2. map的本质

    Map<String, String> map = new HashMap<String, String>(); map.put("1", "va ...

  3. JavaScript函数声明提升

    首先,JavaScript中函数有两种创建方式,即函数声明.函数表达式两种. 1.函数声明. function boo(){ console.log(123); } boo() 2.函数表达式. va ...

  4. Hive HQL学习

    HQL学习   1.hive的数据类型 2.hive_DDL 2.1创建.删除.修改.使用数据库     Default数据库,默认的,优先级相对于其他数据库是最高的   2.2重点:创建表_内部表_ ...

  5. Oracle:控制语句 IF..ELSIF语句、CASE语句、FOR循环语句

    --多重if语句(注意点:BEGIN END ,IF 条件 THEN,ELSIF 条件 THEN,ELSE... END IF)BEGIN IF FALSE THEN DBMS_OUTPUT.put_ ...

  6. win7 64位wamp2.5无法启动MSVCR110.DLL丢失听语音

    从网上下载wampserver2.5 64位的PHP集成环境,根本无法使用,说是丢失了MSVCR110.DLL,然后再网上找了一大堆资料工具都无用,比如下微软的了vcredist_x64,重新卸载安装 ...

  7. 将js进行到底:node学习笔记1

    废话:自高中以来一直对编程充满激情,磨剑五年,如今要毕业了,我不想用我已经擅长的知识敷衍,而想以一个全新的领域去面向我的毕设--是时候学习一下node.js node.js基础 对于JavaScrip ...

  8. 与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件

    与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件 CMDNMapDataCache.cpp  读取二进制代码的方法

  9. protobuf 原理

    Protobuf 的优点 Protobuf 有如 XML,不过它更小.更快.也更简单.你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构.你甚至可以在无需重新部署程序的情况下更新 ...

  10. java+sql 编码 UTF-8、ISO-8859-1、GBK

    摘录自:http://www.cnblogs.com/yezhenhan/archive/2011/01/14/1935376.html java 编码 UTF-8.ISO-8859-1.GBK Ja ...