Description

Hack 国的居民人人都是 OI 大师,Hometown 得知便赶紧来到 Hack 国学习。可想要进入 Hack 国并不是件容易的事情,首先就必须通过 Hack 国海关小 B 的考验。小 B 觉得 Hometown 比较菜,于是就扔了一道小水题给 Hometown。
给定一个长度为 n 的数列 a i ,接下来会对这个序列进行 m 次操作。操作类型分为以下两种:
• 1 l r,表示将区间 [l,r] 轮转一次,具体来说,a l ,a l+1 ,a l+2 ,··· ,a r−1 ,a r 经过一次轮转之后,会变为 a r ,a l ,a l+1 ,··· ,a r−1 ;
• 2 l r k,询问区间 [l,r] 内 a i = k 的个数。
可惜 Hometown 还是不会做,他只能期待你能解决这个问题了。

Input

从文件queue.in中读入数据。
第一行两个整数 n,m,表示序列的长度与操作的次数。
第二行 n 个整数 a i ,表示这个序列。
接下来的 m 行,每行先是一个整数 opt 表示操作的类型。对于 opt = 1 的操作,接下来两个整数 l,r 表示将区间 [l,r] 轮转;对于 opt = 2 的操作,接下来三个整数 l,r,k 表示求区间 [l,r] 内等于 k 的值的个数。

Output

输出到文件queue.out中。
对于每个 2 操作,一行一个整数,表示这次询问的答案。

Sample Input

7 6
1 2 2 3 2 1 3
2 3 6 2
1 1 6
2 2 4 1
1 3 6
2 6 7 3
2 3 5 2

Sample 2

见选手目录下的queue/queue2.in与queue/queue2.ans。
该组样例的数据范围同第 2 个测试点。

Sample 3

见选手目录下的queue/queue3.in与queue/queue3.ans。
该组样例的数据范围同第 13 个测试点。

Sample Output

2
1
2
3

Explanation

对于第一次询问,区间 [3,6] 中一共出现了 2 次 2。
随后进行修改,修改之后序列变为 1,1,2,2,3,2,3。
对于第二次询问,区间 [2,4] 中一共出现了 1 次 1。
随后再次修改,修改之后序列变为 1,1,2,2,2,3,3。
对于第三次询问,区间 [6,7] 中一共出现了 2 次 3。
对于第四次询问,区间 [3,5] 中一共出现了 3 次 2。

Data Constraint

对于 100% 的数据,满足 0 ≤ n,m ≤ 10^5 ,1 ≤ a i ≤ n,1 ≤ l i ≤ r i ≤ n。除此之外,对于每个数据点,还满足以下限制。


Solution

  • 这题我的方法是分块(也可以用 splay+权值线段树)。

  • 用类似块状链表的方法,所有数用一个双向链表连起来。

  • 并且每 n\sqrt nn​ 个数分成一块,每块记录开头指针和结尾指针。

  • 之后每一块开一个桶存每个数出现的次数。

  • 询问的话整块直接在桶中读取,散块直接扫。

  • 如果是翻转的话呢,就把 a[r]a[r]a[r] 对应的指针剪下来,并将其插到 a[l]a[l]a[l] 对应的指针前。

  • 中途顺带修改每个块的信息即可。

  • 查询和修改的复杂度均为 O(n)O(\sqrt n)O(n​) 。

  • 总时间复杂度 O(nn)O(n\sqrt n)O(nn​) 。

  • 要注意下细节和特殊情况,比如说 n=0n=0n=0 、l,rl,rl,r 相同或在同一块内……

Code

#include<cstdio>
#include<cmath>
#include<cctype>
using namespace std;
const int N=1e5+5;
int siz,tot;
int a[N],t[318][N],lt[N],nex[N];
int id[N],st[N],en[N],pl[N],pr[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
int main()
{freopen("queue.in","r",stdin);freopen("queue.out","w",stdout);int n=read(),m=read();if(!n) return 0;siz=sqrt(n);for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++) nex[i]=i+1,lt[i]=i-1;int sum=0;while(sum<n){tot++;pl[tot]=st[tot]=sum+1;for(int i=1;i<=siz && sum<n;i++){sum++;t[tot][a[sum]]++;id[sum]=tot;}pr[tot]=en[tot]=sum;}while(m--){int op=read(),l=read(),r=read();if(op==1){if(l==r) continue;int ll=(l-1)/siz+1,rr=(r-1)/siz+1;int posr=pr[rr]==r?en[rr]:0;if(!posr){posr=st[rr];for(int i=pl[rr];i<r;i++) posr=nex[posr];}int posl=pl[ll]==l?st[ll]:0;if(!posl){posl=en[ll];for(int i=pr[ll];i>l;i--) posl=lt[posl];}t[id[posr]][a[posr]]--;nex[lt[posr]]=nex[posr];lt[nex[posr]]=lt[posr];if(en[rr]==posr) en[rr]=lt[posr];int pos=posr;bool pd=false;while(id[posl]^id[pos]){pos=st[id[pos]];st[id[pos]]=lt[pos];pos=lt[pos];if(pos==posl){en[id[pos]]=posr;id[posr]=id[posl];t[id[pos]][a[pos]]--;id[pos]++;t[id[pos]][a[pos]]++;pd=true;break;}en[id[pos]]=lt[pos];t[id[pos]][a[pos]]--;id[pos]++;t[id[pos]][a[pos]]++;pos=lt[pos];}if(st[ll]==posl) st[ll]=posr;if(!pd) id[posr]=id[posl];nex[lt[posl]]=posr;lt[posr]=lt[posl];nex[posr]=posl;lt[posl]=posr;t[id[posr]][a[posr]]++;}else{int k=read(),ans=0;int ll=(l-1)/siz+1,rr=(r-1)/siz+1;if(ll==rr){int pos=en[ll];for(int i=pr[ll];i>r;i--) pos=lt[pos];for(int i=r;i>=l;i--){if(a[pos]==k) ans++;pos=lt[pos];}write(ans),putchar('\n');continue;}if(pl[ll]^l){int pos=en[ll];for(int i=pr[ll];i>=l;i--){if(a[pos]==k) ans++;pos=lt[pos];}ll++;}if(pr[rr]^r){int pos=st[rr];for(int i=pl[rr];i<=r;i++){if(a[pos]==k) ans++;pos=nex[pos];}rr--;}for(int i=ll;i<=rr;i++) ans+=t[i][k];write(ans),putchar('\n');}}return 0;
}

JZOJ 5924. 【NOIP2018模拟10.23】Queue相关推荐

  1. JZOJ 5922. 【NOIP2018模拟10.23】sequence

    Description 小 F 是一位 Hack 国的居民,他生活在一条长度为 n 的街道上,这个街道上总共有 n 个商店.每个商店里售卖着不同的 Hack 技能包,每个商店本身也会有个便利值.初始时 ...

  2. JZOJ 5923. 【NOIP2018模拟10.23】Bomb

    Description 常数国与 Hack 国近年来战火纷飞. 常数国共有 n 个城市,每两个城市之间均有一条交通线联通.如今常数国遭到 Hack 国的重创,岌岌可危.Hack 国国王小 K 决定轰炸 ...

  3. JZOJ5922. 【NOIP2018模拟10.23】sequence

    传送门 preface 这道题想了好久好久主要是菜,但其实并不是很难,大佬现在走还来得及.... 分析 这道题乍一看没什么想法,暴力50pts骗走溜掉.但其实那个特殊点提示很大. 对于第5个点的话,把 ...

  4. [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)

    题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景: 尊者神高达很穷,所以他需要跑商来赚钱 题目描述: 基三的地图可以看做 n 个城 ...

  5. [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)

    题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才.       ...

  6. jzoj 5906. 【NOIP2018模拟10.15】传送门(树形dp)

    5906. [NOIP2018模拟10.15]传送门 Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normal ...

  7. jzoj5904. 【NOIP2018模拟10.15】刺客信条(并查集)

    5904. [NOIP2018模拟10.15]刺客信条 Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一 ...

  8. jzoj5920. 【NOIP2018模拟10.21】风筝(dp,最长上升子序列)

    5920. [NOIP2018模拟10.21]风筝 Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- Description oyiya 在 AK 了 IOI 之 ...

  9. JZOJ 5939. 【NOIP2018模拟10.30】阻击计划

    Description 最近,小J发现小R和小Z之间的关系十分密切,心中十分嫉妒,为了拆散他们,小J经常扰乱他们一起玩耍的计划. 问题描述 小R和小Z打算在这个周末一起骑车在G国的城市看风景,G国的城 ...

最新文章

  1. docker 不使用缓存重建镜像
  2. 网站SEO优化可通过哪些数据分析来解决问题?
  3. 判断sem信号量为零_Linux系统编程——进程同步与互斥:System V 信号量
  4. TCP性能和发送接收窗口、Buffer的关系
  5. java.lang.NumberFormatException: For input string: F
  6. maven pc配置要求_《使命召唤:黑色行动5》公开测试PC配置要求:推荐GTX970+i7
  7. spring入门到放弃——spring事务管理
  8. 【AI面试题】逻辑回归和线性回归的区别
  9. Jupyter编程完成对手写体Mnist数据集中10个字符 (0-9)的分类识别
  10. ZYNQ7020 FPGA如何从Flash启动的详细步骤
  11. 青龙面板-闲趣赚修复版
  12. 熬夜整理了一万多字的line-height总结,你还看不懂那我真的要跪了!
  13. USB转I2C芯片操作EEPROM--CH347应用
  14. 《Android之大话设计模式》--设计原则 第二章:单一职责原则 乔峰VS慕容复
  15. python 面向对象 搬家具实例
  16. 干货满满 | 不容错过的数据科学入门数学指南
  17. oracle基础|oracle排序用法|order by用法|where用法
  18. sdk编译文件报错conflicting types for ‘kill‘
  19. Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey
  20. openstack(keypair API)

热门文章

  1. Python学习笔记:Io编程序列化
  2. [云炬创业管理笔记]第二章测试3
  3. 一文详解SVM的Soft-Margin机制
  4. 目标跟踪:CamShift算法
  5. 用grub4dos修复grub
  6. ubuntu 20上安装gdbgui
  7. python中的magic方法
  8. BUUCTF-Reverse:reverse3
  9. BugkuCTF-Misc:又一张图片,还单纯吗
  10. 汇编中断程序编写步骤