题目链接

思路

对于每一种颜色都建立一个动态开点线段树。然后每次查询的时候就去这个颜色的线段树上查询就行了。修改之后不要忘记交换颜色。

这个题目数据有点强。抄了个比较快的读入优化才卡过去。

代码

  1. /*
  2. * @Author: wxyww
  3. * @Date: 2018-12-13 08:59:51
  4. * @Last Modified time: 2018-12-13 09:56:16
  5. */
  6. #include<cstdio>
  7. #include<iostream>
  8. using namespace std;
  9. typedef long long ll;
  10. const int N = 600000;
  11. #include <sys/mman.h>
  12. #pragma GCC optimize("O3")
  13. #pragma G++ optimize("O3")
  14. #define Finline __inline__ __attribute__ ((always_inline))
  15. struct io{
  16. char *s;
  17. io():s((char*)mmap(0, 1<<26, PROT_READ, MAP_PRIVATE, fileno(stdin), 0)) {}
  18. inline operator int()
  19. {
  20. register int x=0;
  21. for(;*s<48;++s);
  22. for(;*s>47;)x=x*10+*s++-48;
  23. return x;
  24. }
  25. }io;
  26. int TR[N * 20],a[N],ls[N * 20],rs[N * 20];
  27. int tot,root[N];
  28. inline void update(int &cur,int l,int r,int pos,int c) {
  29. if(!cur) cur = ++tot;
  30. if(l == r) {
  31. TR[cur] += c;
  32. return;
  33. }
  34. TR[cur] += c;
  35. int mid = (l + r) >> 1;
  36. if(pos <= mid) update(ls[cur],l,mid,pos,c);
  37. else update(rs[cur],mid + 1,r,pos,c);
  38. }
  39. inline int query(int cur,int l,int r,int L,int R) {
  40. if(L <= l && R >= r) return TR[cur];
  41. int mid = (l + r) >> 1,ans = 0;
  42. if(L <= mid) ans += query(ls[cur],l,mid,L,R);
  43. if(R > mid) ans += query(rs[cur],mid + 1,r,L,R);
  44. return ans;
  45. }
  46. int main() {
  47. int n = io,m = io;
  48. for(int i = 1;i <= n;++i) {
  49. a[i] = io;
  50. update(root[a[i]],1,n,i,1);
  51. }
  52. while(m--) {
  53. int opt = io;
  54. if(opt == 1) {
  55. int l = io,r = io,c = io;
  56. printf("%d\n",query(root[c],1,n,l,r));
  57. }
  58. else {
  59. int x = io;
  60. update(root[a[x]],1,n,x,-1);
  61. update(root[a[x]],1,n,x + 1,1);
  62. update(root[a[x + 1]],1,n,x + 1,-1);
  63. update(root[a[x + 1]],1,n,x,1);
  64. swap(a[x],a[x + 1]);
  65. }
  66. }
  67. return 0;
  68. }

[luogu3939][数颜色]的更多相关文章

  1. BZOJ 2120: 数颜色

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 3623  Solved: 1396[Submit][Status][Discuss] ...

  2. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

  3. BZOJ 2120 数颜色(带修改的莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 3478  Solved: 1342 [Submit][Status][Discus ...

  4. BZOJ 2120: 数颜色 分块

    2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  5. Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 2645  Solved: 1039[Submit][Status][Discuss] ...

  6. bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)

    P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...

  7. BZOJ 2120 数颜色 (带修莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6367  Solved: 2537[Submit][Status][Discuss] ...

  8. Luogu 1903 数颜色 | 分块

    Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...

  9. P3939 数颜色

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

随机推荐

  1. systemd取消对服务重启的限制

    默认情况下,一个服务在10秒内最多允许启动5次.当超过5次后,会报如下错误: Job for xx.service failed because start of the service was at ...

  2. rsync: chgrp "/.hosts.NBCxBB" (in test) failed: Operation not permitted (1)

    #记一次rsync出现的错误(网上基本都是说权限问题) #这并不是权限的问题,应为实际的文件已经传过去了,但是rsync就是会报这个错误,(虽然使用是正常的,但是看着就是不爽) [root@local ...

  3. ABP 番外篇-菜单

    public class LearningMpaAbpNavigationProvider : NavigationProvider { public override void SetNavigat ...

  4. 实现纯英文string的逆序输出

      第一种方法: using namespace std; void Reverse(string &a) { int n = a.size(); char b; ;i<n/;i++) ...

  5. node.js 运行机制与简单使用

    一.hello world 1.引入 required 模块 2.创建服务器 3.接收请求与响应请求 var http = require('http'); // 载入http模块 http.crea ...

  6. Codeforces1073E Segment Sum 【数位DP】

    题目分析: 裸的数位DP,注意细节. #include<bits/stdc++.h> using namespace std; ; int k; ][],sz[][],cnt[][]; ] ...

  7. LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】

    题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...

  8. 洛谷P1092 虫食算(算竞进阶习题)

    模拟+dfs 这个题就三行,搜索的话我们从右向左,从上到下.. 如果是在1,2行我们就直接枚举0-n所有数,但是到了第三行,最直接的就是填上这一列上前两行的数的和modN,在此基础上判断该填的数有没有 ...

  9. 【XSY1544】fixed 数学 强连通图计数

    题目描述 ​ 给你一个\(n\times n\)的方阵\(A\).定义方阵\(A\)的不动点\((i,j)\)为:\(\forall p,q\geq 0,(A^p)_{i,j}=(A^q)_{i,j} ...

  10. opencv 图片剪切

    import cv2 as cv import numpy as np # 图片剪切 img = cv.imread('../images/moon.jpg', flags=1) # flags=1读 ...