传送门

有splay的做法,有树状数组的做法。。。

最好理解的还是线段树的做法。

一开始我是这样想的,如果移动某一个人,只有当前行和最后一列会受到影响,感觉就像是个线段树,树状数组什么的。

然而接下来就想歪了,把一个人移到后面,等于把后面的整体往前移一格,gg

正确思路是权值线段树,如果一个数被移走,相当于这个数的个数-1,然后把它变成了m+1,放到后面。

移动第x行第y个人其实就是求第x行的第y大。

这样,每一行和最后一列建一棵线段树,然而超空间。

所以需要动态开点,因为总共只移动3*10^5次,也就是开nlongn的点。

据说逆向思维可以骗50分,这都没想到。。。

最后附上丑陋的,调了一晚上的,连我自己都看不懂的代码——

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define N 600001
  5. #define LL long long
  6.  
  7. using namespace std;
  8.  
  9. int n, m, q, M, cnt;
  10. int size[N], sum[N * 10], ls[N * 10], rs[N * 10], root[N];
  11. LL val[N * 10];
  12.  
  13. inline int read()
  14. {
  15. int x = 0, f = 1;
  16. char ch = getchar();
  17. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
  18. for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
  19. return x * f;
  20. }
  21.  
  22. inline LL del(int &now, int l, int r, int x, int f, int h)
  23. {
  24. if(!now) now = ++cnt;
  25. sum[now]--;
  26. if(l == r)
  27. {
  28. if(!f) return val[now] ? val[now] : (LL)(h - 1) * m + l;
  29. return val[now] ? val[now] : (LL)l * m;
  30. }
  31. int mid = (l + r) >> 1;
  32. if(mid - l + 1 + sum[ls[now]] >= x) return del(ls[now], l, mid, x, f, h);
  33. else return del(rs[now], mid + 1, r, x - (mid - l + 1 + sum[ls[now]]), f, h);
  34. }
  35.  
  36. inline void insert(int &now, int l, int r, int x, LL d)
  37. {
  38. if(!now) now = ++cnt;
  39. if(l == r)
  40. {
  41. val[now] = d;
  42. return;
  43. }
  44. int mid = (l + r) >> 1;
  45. if(x <= mid) insert(ls[now], l, mid, x, d);
  46. else insert(rs[now], mid + 1, r, x, d);
  47. }
  48.  
  49. int main()
  50. {
  51. int i, x, y;
  52. LL a, b;
  53. n = read();
  54. m = read();
  55. q = read();
  56. M = max(n, m) + q;
  57. size[0] = n;
  58. for(i = 1; i <= n; i++) size[i] = m - 1;
  59. while(q--)
  60. {
  61. x = read();
  62. y = read();
  63. if(y != m) a = del(root[x], 1, M, y, 0, x);
  64. b = del(root[0], 1, M, x, 1, x);
  65. printf("%lld\n", y == m ? a = b : a);
  66. if(y != m)
  67. {
  68. ++size[x];
  69. insert(root[x], 1, M, size[x], b);
  70. }
  71. ++size[0];
  72. insert(root[0], 1, M, size[0], a);
  73. }
  74. return 0;
  75. }

  

就让这个题作为我回归奥赛的开端,SDOI2018加油!

[luoguP3960] 列队(动态开点线段树)的更多相关文章

  1. Luogu P3960 列队(动态开点线段树)

    P3960 列队 题意 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有\(n \times m ...

  2. NOIP2017 列队——动态开点线段树

    Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

  3. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  4. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  5. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  6. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 247  Solved: 113[Submit][Status][Discuss ...

  7. codeforces 893F - Physical Education Lessons 动态开点线段树合并

    https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...

  8. codeforces 915E - Physical Education Lessons 动态开点线段树

    题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...

  9. CF915E Physical Education Lessons 动态开点线段树

    题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...

  10. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

随机推荐

  1. Highcharts在IE8中不能一次性正常显示的一种解决办法

    由于客户要求必须在IE浏览器下兼容图表,故选用了兼容性较好的Highcharts.另外说一句,博主尝试过ichartjs.ECharts.YUI,兼容性都没有Highcharts给力(所有的兼容性问题 ...

  2. XSS 攻击实验 & 防御方案

    XSS 攻击&防御实验 不要觉得你的网站很安全,实际上每个网站或多或少都存在漏洞,其中xss/csrf是最常见的漏洞,也是最容易被开发者忽略的漏洞,一不小心就要被黑 下面以一个用户列表页面来演 ...

  3. java httpclient 跳过证书验证

    import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.Unknow ...

  4. CloudFoundry命令行和Kubernetes命令行的Restful API消费方式

    先说CloudFoundry的命令行工具CLI.我们在CloudFoundry环境下工作,第一个使用的命令就是cf login. 如果在环境变量里维护CF_TRACE的值为true: 则我们能发现,诸 ...

  5. javaEE(13)_jdbc框架

    一.使用模板方法设计模式简化开发 模板方法设计模式,执行一个程序有很多步骤,将每次都要执行的共有的提取出来放到一个抽象父类中,变化的部分通过让子类传递参数过来或将这部分抽象为抽象方法让子类通过继承的方 ...

  6. shell基础笔记1

    ---恢复内容开始--- 1 test命令中不能使用浮点小数值,如:    A=1.444444:[    $A -gt 1  ] 2 test命令中的>或<必须转义,否则shell会把它 ...

  7. [LUOGU] P1387 最大正方形

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  8. Django REST framework 中的视图

    1.Request REST framework传入视图的request对象不再是Django默认的Httprequest对象,而是DRF提供的扩展类的Request类的对象 常用属性 request ...

  9. [图文] Fedora 28 使用 Virt-Manager 制作并优化QCOW2镜像——Windows 10 1709

    实验说明: 云计算的发展使得桌面上云,windows 10就必不可少,这一章就如何制作QCOW2镜像文件并优化进行说明. 实验环境: 宿主机系统   :Fedora 28 WorkStation 虚拟 ...

  10. 计算机/ARM 系统

    这方面知识,自己有了大概了解,可以再没有重要急需学习的安排时,不时的翻翻这方面的书.本能力属于重要但不急需的能力