题目链接

洛谷P4559

题解

只会做\(70\)分的\(O(nlog^2n)\)

如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑

找到这些空位就用二分 + 主席树

理应可以在主席树上的区间二分而做到\(O(nlogn)\),但是写不出来,先留着坑

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define REP(i,n) for (register int i = 1; i <= (n); i++)
  8. #define mp(a,b) make_pair<int,long long int>(a,b)
  9. #define cp pair<int,long long int>
  10. #define LL long long int
  11. using namespace std;
  12. const int maxn = 500005,maxm = 11000005,INF = 1000000000;
  13. inline int read(){
  14. int out = 0,flag = 1; char c = getchar();
  15. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  16. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  17. return out * flag;
  18. }
  19. int N,n,m,rt[maxn];
  20. int ls[maxm],rs[maxm],num[maxm],cnt;
  21. LL sum[maxm];
  22. void modify(int& u,int pre,int l,int r,int pos){
  23. u = ++cnt;
  24. sum[u] = sum[pre] + pos; num[u] = num[pre] + 1;
  25. ls[u] = ls[pre]; rs[u] = rs[pre];
  26. if (l == r) return;
  27. int mid = l + r >> 1;
  28. if (mid >= pos) modify(ls[u],ls[pre],l,mid,pos);
  29. else modify(rs[u],rs[pre],mid + 1,r,pos);
  30. }
  31. int q_num(int u,int v,int l,int r,int L,int R){
  32. if (l >= L && r <= R) return num[u] - num[v];
  33. int mid = l + r >> 1;
  34. if (mid >= R) return q_num(ls[u],ls[v],l,mid,L,R);
  35. if (mid < L) return q_num(rs[u],rs[v],mid + 1,r,L,R);
  36. return q_num(ls[u],ls[v],l,mid,L,R) + q_num(rs[u],rs[v],mid + 1,r,L,R);
  37. }
  38. LL q_sum(int u,int v,int l,int r,int L,int R){
  39. if (l >= L && r <= R) return sum[u] - sum[v];
  40. int mid = l + r >> 1;
  41. if (mid >= R) return q_sum(ls[u],ls[v],l,mid,L,R);
  42. if (mid < L) return q_sum(rs[u],rs[v],mid + 1,r,L,R);
  43. return q_sum(ls[u],ls[v],l,mid,L,R) + q_sum(rs[u],rs[v],mid + 1,r,L,R);
  44. }
  45. inline LL S(int l,int r){
  46. return 1ll * (l + r) * (r - l + 1) / 2;
  47. }
  48. inline LL q_pre(int u,int v,int L,int R,int k){
  49. int ll = L,rr = R,mid; LL a;
  50. while (ll < rr){
  51. mid = ll + rr >> 1;
  52. a = q_num(u,v,1,N,L,mid);
  53. if ((mid - L + 1) - a >= k) rr = mid;
  54. else ll = mid + 1;
  55. }
  56. a = q_sum(u,v,1,N,L,ll);
  57. return S(L,ll) - a;
  58. }
  59. inline LL q_post(int u,int v,int L,int R,int k){
  60. int ll = L,rr = R,mid,a;
  61. while (ll < rr){
  62. mid = ll + rr + 1 >> 1;
  63. a = q_num(u,v,1,N,mid,R);
  64. if ((R - mid + 1) - a >= k) ll = mid;
  65. else rr = mid - 1;
  66. }
  67. a = q_sum(u,v,1,N,mid,R);
  68. return S(ll,R) - a;
  69. }
  70. void work(){
  71. int l,r,L,R,a,s; LL ans,b;
  72. while (m--){
  73. l = read(); r = read(); L = read(); R = L + r - l; ans = 0;
  74. if (L > 1){
  75. a = q_num(rt[r],rt[l - 1],1,N,1,L - 1);
  76. if (a){
  77. s = q_sum(rt[r],rt[l - 1],1,N,1,L - 1);
  78. b = q_pre(rt[r],rt[l - 1],L,R,a);
  79. ans += b - s;
  80. }
  81. }
  82. a = q_num(rt[r],rt[l - 1],1,N,R + 1,N);
  83. if (a){
  84. s = q_sum(rt[r],rt[l - 1],1,N,R + 1,N);
  85. b = q_post(rt[r],rt[l - 1],L,R,a);
  86. ans += s - b;
  87. }
  88. printf("%lld\n",ans);
  89. }
  90. }
  91. int main(){
  92. n = read(); m = read(); N = 1000000 + n + 1; int x;
  93. REP(i,n){
  94. x = read(),modify(rt[i],rt[i - 1],1,N,x);
  95. }
  96. work();
  97. return 0;
  98. }

洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】的更多相关文章

  1. 洛谷P4559 [JSOI2018]列队(主席树)

    题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优 ...

  2. 洛谷P1979 华容道(70分 暴力)

    P1979 华容道 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少 ...

  3. 洛谷P1081 开车旅行70分

    https://www.luogu.org/problem/show?pid=1081 太遗憾了明明写出来了,却把最小值初始值弄小了,从第二个点开始就不可能对了.70分! #include<io ...

  4. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

  5. 洛谷P2633 Count on a tree(主席树,倍增LCA)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  6. 【洛谷4587】 [FJOI2016]神秘数(主席树)

    传送门 BZOJ 然而是权限题 洛谷 Solution 发现题目给出的一些规律,emm,如果我们新凑出来的一个数,那么后面一个数一定是\(sum+1\). 于是就可以主席树随便维护了! 代码实现 #i ...

  7. 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  8. 洛谷P2633/bzoj2588 Count on a tree (主席树)

    洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...

  9. 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)

    题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...

随机推荐

  1. 原生与JS交互 iOS

      前言 Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势” ...

  2. 【Jmeter测试】如何使用BeanShell断言判断请求返回的Json相应结果

      脚本结构​上图中,queryMaterialApiDTOListByPkIds是返回Json格式响应结果的请求,然后添加BeanShell断言详细判断Json结果中的值是否正确. Json格式的相 ...

  3. python爬虫入门之URL

    python爬虫,顾名思义是爬取信息的.大数据时代,信息的获取是非常关键的,它甚至能决定一个公司大发展的方向与未来,互联网就好像一张大网,人们想要获取信息就要从这张大网里爬取,这种手段也可以称为搜索引 ...

  4. Unity学习笔记(2): 如何使物体消失

    Unity使物体消失的三种方法 GameObject.Destroy(gameobjcet); //在下一帧破坏物体 gameObject.SetActive(false); //Unity2017新 ...

  5. leetcode-每个节点的右向指针(填充同一层的兄弟节点)

    给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...

  6. 【Linux 运维】 date的使用

    date的使用 一.常用时间格式 #年.月.日 四位年大写,其余小写 [root@localhost ~]# date +%Y #长格式显示四位数年 [root@localhost ~]# date ...

  7. shell基础 -- 基本正则表达式

    正则表达式(Regular Expression,通常简称为 regex 或 RE)是一种表达方式,可以用它来查找匹配特定准则的文本.在许多编程语言中都有用到正则表达式,常用它来实现一些复杂的匹配.这 ...

  8. 哈夫曼(Huffman)树+哈夫曼编码

    前天acm实验课,老师教了几种排序,抓的一套题上有一个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这里我就结合课本,整理一篇关于哈夫曼树的博客. 主要摘自https://www.cnblogs.co ...

  9. 《C》VS控制台应用

    源(c)文件:主要是源码,包括程序入口,函数的实现 头(h)文件:主要是定义的函数声明 资源(rc)文件:程序中用到的辅助资源,比如位图,图标资源 解决VS2015安装后stdio.h ucrtd.l ...

  10. “我爱淘”第二冲刺阶段Scrum站立会议3

    完成任务: 完成了注册界面的设计,以及部分代码,但是还没有完成服务器端的添加功能. 计划任务: 将注册功能实现了它,可以对数据库进行添加,在客户端实现分类功能,通过学院的分类查看书籍. 遇到问题: 分 ...