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. 读懂_countof,可以懂得什么

    在c++开发中数组是我们经常使用存储结构,而于此同时"数组越界"是每个c++程序员不能不提防陷阱. 还好,我们有预定义宏_countof. 一.在visual c++开发环境下,它 ...

  2. DTD约束

    DTD约束 一,导入DTD方式   二,DTD语法 2)DTD语法 约束标签 <!ELEMENT 元素名称类别>或<!ELEMENT 元素名称(元素内容)> 类别: 空标签: ...

  3. linux中的两个命令setfacl和chmod有什么区别

    setfacl命令可以用来细分linux下的文件权限.chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限. 比较常用的用法如下:setfacl ...

  4. phpStudy2016 配置多个域名期间遇到的问题

    http://www.cnblogs.com/ssfs/p/6255791.html 第一步 在C:\Windows\System32\drivers\etc下的hosts文件下添加   第二步   ...

  5. 你知道织梦后台安装插件时为什么会出现这个Character postion 686, 'item'&n

    https://zhidao.baidu.com/question/589525064.html?qbl=relate_question_3&word=Tag Character postio ...

  6. Eclipse报错An internal error occurred during: "J2EE Component Mapping Update". java.lang.NullPointerException

    Eclipse每次打开.java文件时,报错信息如下: An internal error occurred during: "J2EE Component Mapping Update&q ...

  7. iOS enum 定义与使用

    枚举其实很重要,特别是在应用开发初期,服务器端数据格式需要更改得情况下,枚举和宏都能是程序简洁,并且改动小. 网上有个人写的言简意赅,适合初学 转自:http://blog.csdn.net/ysy4 ...

  8. 一天浓缩学习webpack经过

    熟话说浓缩就是精华,哈哈,所以就这么简单粗暴的介绍下吧,写下的都是精华. 已经不是第一次听说webpack,但是我的起步有点晚,现在才看.开门见山~~ 1.什么是webpack? webpack是当下 ...

  9. JAVA异步加回调的例子

    package com.sunchao.callback; /** * callback interface * @author Administrator * */ public interface ...

  10. [知了堂学习笔记]_MVC设计模式与JavaWEB三层架构

    一.MVC设计模式 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controlle ...