【题解】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 项目转换成 Maven 项目

    如何将 Java 项目转换成 Maven 项目 本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明 ...

  2. ylb:日期和时间函数

    ylbtech-SQL Server:SQL Server-日期和时间函数 日期和时间函数. ylb:日期和时间函数 返回顶部 1,日期和时间函数获取(当前)日期 GetDate() 2,提取部分日期 ...

  3. 即将到来的Android N,将具备这些新特性

    原文转自:http://www.leiphone.com/news/201602/pSRQAuAjMFJITqHe.html         原创 訾竣喆 即将到来的Android N,将具备这些新特 ...

  4. Eclipse Memory Analyzer安装

    转载:http://www.jianshu.com/p/3b3c3a914724 1.下载地址:Eclipse Memory Analyzer Open Source Project   2.点击进入 ...

  5. 2017.04.20 Adams仿真介绍

    Adams 仿真 | 验证"隐性机器人模型"概念,提高视觉伺服精度 产品:Adams行业:科研优势: 1.Adams 仿真可精确预测机器人的位置和方位 2.仿真在理论工作验证中起着 ...

  6. spring(16)------spring的数据源配置

    在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用DriverManagerDataSource配置数据源与 ...

  7. List集合的遍历方法

    估计你永远都不会忘记这三个方法了...... public static void main(String[] args) { //超级for循环遍历方法 List<String> lis ...

  8. 一份还热乎的蚂蚁面经(已拿Offer)!附答案!!

    本文来自我的知识星球的球友投稿,他在最近的校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由作者--泽林提供,部分答案由Hollis整理自知识星球<Hollis和他的朋友们>中「 ...

  9. 结缘mac

    还记得上一次买MacBookPro.是在去年的7月下旬,记得那次是我大学第一次买电脑,那时候刚准备開始研究android.听stormzhang以及android开发界的大佬们对mac开发androi ...

  10. 玩转 eclipse:[1]如何快速找错-debug

    本文摘自百度经验 原文地址如下: 玩转 eclipse:[1]如何快速找错-debu eclipse是软件开发人员必备的IDE之一. 由于语言障碍或者是经验不足,许多刚刚新手并不清楚如何高效使用ecl ...