【题解】P3939 数颜色

不要数据结构和模板学傻了...

考虑到兔子们交换都是相邻的,说明任何一次交换只会引起\(O(1)\)的变化。

我们开很多\(vector\)存没种兔子的下标就好了。到时候二分查找查询。

复杂度\(O(nlogn)\)

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. #include<queue>
  6. #include<bitset>
  7. #include<vector>
  8. #include<map>
  9. #include<ctime>
  10. #include<cstdlib>
  11. #include<set>
  12. #include<bitset>
  13. #include<stack>
  14. #include<list>
  15. #include<cmath>
  16. using namespace std;
  17. #define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t)
  18. #define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t)
  19. #define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
  20. #define Max(a,b) ((a)<(b)?(b):(a))
  21. #define Min(a,b) ((a)<(b)?(a):(b))
  22. #define TMP template<class ccf>
  23. typedef long long ll;
  24. TMP inline ccf qr(ccf k){
  25. char c=getchar();
  26. ccf x=0;
  27. int q=1;
  28. while(c<48||c>57)
  29. q=c==45?-1:q,c=getchar();
  30. while(c>=48&&c<=57)
  31. x=x*10+c-48,c=getchar();
  32. if(q==-1)
  33. x=-x;
  34. return x;
  35. }
  36. const int maxn=3e5+15;
  37. int data[maxn];
  38. vector < int > col[maxn];
  39. int n,m;
  40. inline int div(vector < int >& p,int lb,int rb,int k){
  41. // to lb
  42. int mid;
  43. int ret=0;
  44. do{
  45. mid=(lb+rb)>>1;
  46. if(p[mid]>=k)
  47. rb=mid-1,ret=mid;
  48. else
  49. lb=mid+1;
  50. }while(lb<=rb);
  51. return ret;
  52. }
  53. inline int div2(vector < int > &p,int lb,int rb,int k){
  54. int ret=-1;
  55. int mid;
  56. do{
  57. mid=(lb+rb)>>1;
  58. if(p[mid]<=k)
  59. lb=mid+1,ret=mid;
  60. else
  61. rb=mid-1;
  62. }while(lb<=rb);
  63. return ret;
  64. }
  65. inline void upd(int c,int pos,int to){
  66. int ret=div(col[c],0,col[c].size()-1,pos);
  67. if(ret<0)
  68. return void(cout<<"err!\n");
  69. col[c][ret]=to;
  70. }
  71. inline int cnt(int c,int lb,int rb){
  72. int ret=0;
  73. int siz=col[c].size()-1;
  74. if(siz<0)
  75. return 0;
  76. if(rb<col[c][0])
  77. return 0;
  78. if(lb>col[c][siz])
  79. return 0;
  80. ret+=div2(col[c],0,siz,rb);
  81. ret-=div(col[c],0,siz,lb);
  82. return ret+1;
  83. }
  84. int t1,t2,t3,t4;
  85. int main(){
  86. #ifndef ONLINE_JUDGE
  87. freopen("in.in","r",stdin);
  88. freopen("out.out","w",stdout);
  89. #endif
  90. n=qr(1);
  91. m=qr(1);
  92. RP(t,1,n){
  93. data[t]=qr(1);
  94. col[data[t]].push_back(t);
  95. }
  96. RP(t,1,m){
  97. t1=qr(1);
  98. if(t1==1){
  99. t2=qr(1);
  100. t3=qr(1);
  101. t4=qr(1);
  102. cout<<cnt(t4,t2,t3)<<endl;
  103. }else{
  104. t2=qr(1);
  105. if(data[t2]==data[t2+1])
  106. continue;
  107. else{
  108. upd(data[t2],t2,t2+1);
  109. upd(data[t2+1],t2+1,t2);
  110. swap(data[t2],data[t2+1]);
  111. }
  112. }
  113. }
  114. return 0;
  115. }

【题解】P3939数颜色的更多相关文章

  1. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  2. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  3. P3939 数颜色

    目录 题目 思路1(待修莫队) 思路2(vector+二分) 代码1 代码2 题目 P3939 数颜色 思路1(待修莫队) 哇,这不是莫队模板题吗 3e5,TLE45分 不行 我有信仰啊 pow(n, ...

  4. 洛谷——P3939 数颜色(暴力vecotr+二分)

    P3939 数颜色 $vecotr$里二分就是好用,全是$STL$ 颜色数目比较少,可以对每一种颜色弄一个$vector$记录一下,查找$l,r$内颜色数为$x$的兔子数,直接在$G[x]$这个$ve ...

  5. P3939 数颜色 线段树动态开点

    P3939 数颜色 线段树动态开点 luogu P3939 水.直接对每种颜色开个权值线段树即可,注意动态开点. #include <cstdio> #include <algori ...

  6. [luogu]P3939 数颜色[二分]

    [luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排, ...

  7. 洛谷P3939 数颜色 二分查找

    正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...

  8. [洛谷P3939]:数颜色(二分)

    题目传送门 题目描述 小$C$的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有相同的颜色.小$C$把她标号从$1$到$n$的$n$只兔子排成长长的一排,来给他们喂胡萝卜吃.排列 ...

  9. 【题解】数颜色 STL vector数组

    小 C 的兔子不是雪白的,而是五彩缤纷的. 题目 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n只兔子排 ...

随机推荐

  1. Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序

    实例化子类时,父类与子类中的静态代码块.实例代码块.静态变量.实例变量.构造函数的执行顺序是怎样的? 代码执行的优先级为: firest:静态部分 second:实例化过程 详细顺序为: 1.父类静态 ...

  2. 【音乐App】—— Vue-music 项目学习笔记:歌手页面开发

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 一.歌手页面布局与设计 需 ...

  3. Scala 中Array,List,Tuple的差别

    尽管学了一段时间的Scala了,可是总认为基础不是太扎实,还有非常多的基础知识比較模糊.于是近期又打算又一次学习基础. Scala中的三种集合类型包含:Array,List,Tuple.那么究竟这三种 ...

  4. JAVA Eclipse创建的Android程序如何不显示标题栏

    在manifest.xml文件的application节点添加下面一行即可 android:theme="@android:style/Theme.NoTitleBar" 如果要恢 ...

  5. JAVA Eclipse创建Android程序界面不显示怎么办

    一般是由于你创建的Android应用程序版本太高导致的,请设置4或以下版本,对于已有的项目,可以在属性-Android中修改目标生成的版本号                               ...

  6. es6 - 导入导出

    今天用node纠结了半天,明明是正确的语法,一直报错,原来node和chrome并不支持es6语法.... 1. npm install package.json { "name" ...

  7. winform制作自定义控件

    一 .概述Windows 窗体控件是可再次使用的组件,它们封装了用户界面功能,并且可以用于客户端 Windows 应用程序.“Windows 窗体”不仅提供了许多现成控件,还提供了自行开发控件的基础结 ...

  8. c语言字符数组的初始化问题

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...

  9. 高阶函数:filter()

    Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是 ...

  10. 字符串各个字符ASCII值加5

    程序实现目标: 输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果 程序要求:该字符串只包含小写字母,若其值加5后的字符值大于'z',将其转换成从a开始的字符. 分析:问题归结为三点: 1 ...