题意:给出n条铁路区间\([L,R]\),共有m个boom依时间顺序放置在\(k_i\)中,区间与\(k_i\)有交集的都被炸掉

求每次炸掉的铁路个数和最后输出所有id被炸的时间点

炸弹能炸到的区间满足\(L≤K≤R\)

因为\(L\)与\(R\)无关,将其关系改写为\(X≤K≤Y\),

对应于二维空间,铁路区间相当于一个点\((L,R)\),每次询问有多少个没被屏蔽的点满足\(X≤K\)且\(K≤Y\)

然后KD树乱搞剪枝就好

唯一的问题是屏蔽掉的点无法在push_up时再次更新两个维度的极左极右值\(lx,rx\)(要么再多维护次左次右值)

幸好没被卡(反而跑的贼快

  1. #include<bits/stdc++.h>
  2. #define rep(i,j,k) for(register int i=j;i<=k;i++)
  3. #define rrep(i,j,k) for(register int i=j;i>=k;i--)
  4. #define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
  5. #define print(a) printf("%lld",(ll)a)
  6. #define println(a) printf("%lld\n",(ll)a)
  7. #define printbk(a) printf("%lld ",(ll)a)
  8. #define IOS ios::sync_with_stdio(0)
  9. using namespace std;
  10. const int MAXN = 3e5+11;
  11. const int INF = 0x3f3f3f3f;
  12. const double EPS = 1e-7;
  13. typedef long long ll;
  14. const ll MOD = 998244353;
  15. ll read(){
  16. ll x=0,f=1;register char ch=getchar();
  17. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  18. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  19. return x*f;
  20. }
  21. int D,CLOCK;
  22. int ans[MAXN];
  23. ll sum,prod;
  24. struct POINT{
  25. int x[2],idx;
  26. bool operator < (const POINT &rhs) const{
  27. return x[D]<rhs.x[D];
  28. }
  29. }p[MAXN];
  30. struct KD{
  31. int lx[MAXN][2],rx[MAXN][2];
  32. int son[MAXN][2],size[MAXN];
  33. int mark[MAXN];
  34. int root;
  35. #define lc son[o][0]
  36. #define rc son[o][1]
  37. void pu(int o){
  38. size[o]=mark[o];
  39. if(lc) size[o]+=size[lc];
  40. if(rc) size[o]+=size[rc];
  41. rep(i,0,1){
  42. if(lc&&lx[lc][i]<lx[o][i]) lx[o][i]=lx[lc][i];
  43. if(rc&&lx[rc][i]<lx[o][i]) lx[o][i]=lx[rc][i];
  44. if(lc&&rx[lc][i]>rx[o][i]) rx[o][i]=rx[lc][i];
  45. if(rc&&rx[rc][i]>rx[o][i]) rx[o][i]=rx[rc][i];
  46. }
  47. }
  48. int build(int d,int l,int r){
  49. int mid=l+r>>1; D=d; mark[mid]=1;
  50. nth_element(p+l,p+mid,p+r+1);
  51. rep(i,0,1) lx[mid][i]=rx[mid][i]=p[mid].x[i];
  52. size[mid]=1;son[mid][0]=son[mid][1]=0;
  53. if(l<mid) son[mid][0]=build(d^1,l,mid-1);
  54. if(r>mid) son[mid][1]=build(d^1,mid+1,r);
  55. pu(mid);
  56. return mid;
  57. }
  58. void query(int o,int k){
  59. if(!o) return;
  60. if(!size[o]) return;
  61. if(lx[o][0]>k||rx[o][1]<k) return;
  62. if(mark[o]&&p[o].x[0]<=k&&p[o].x[1]>=k){
  63. ans[p[o].idx]=CLOCK;
  64. sum++; prod=(prod*p[o].idx)%MOD;
  65. mark[o]=0;
  66. }
  67. if(lc) query(lc,k);
  68. if(rc) query(rc,k);
  69. pu(o);
  70. }
  71. }kd;
  72. int main(){
  73. int T=read(),kase=0,n,m;
  74. while(T--){
  75. n=read(); m=read();
  76. rep(i,1,n){
  77. p[i].x[0]=read();
  78. p[i].x[1]=read();
  79. p[i].idx=i;
  80. }
  81. memset(ans,0,sizeof ans);
  82. //kd.baoli();
  83. kd.root=kd.build(0,1,n);
  84. ll lastans=0; CLOCK=0;
  85. printf("Case #%d:\n",++kase);
  86. while(m--){
  87. sum=0; prod=1;
  88. ll pos=lastans^read();
  89. ++CLOCK;
  90. kd.query(kd.root,pos);
  91. println(sum);
  92. if(sum) lastans=prod;
  93. else lastans=0;
  94. }
  95. rep(i,1,n){
  96. if(i==n) println(ans[i]);
  97. else printbk(ans[i]);
  98. }
  99. }
  100. return 0;
  101. }

2018牛客多校6 - I Team Rocket KD树维护空间的更多相关文章

  1. 牛客多校第三次B——线段树维护线性基交

    写线性基交函数时调试了半天.. #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn ...

  2. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  3. 牛客多校3 A-PACM Team(状压降维+路径背包)

    PACM Team 链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144 ...

  4. 2018牛客多校第六场 I.Team Rocket

    题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...

  5. 2018牛客多校2 - J farm 随机乱搞/二进制分组

    题意:给定n*m的格子,每个格子有不同的种类,q次操作,每次操作使[x1,y1]到[x2,y2]的格子除了k类型的以外都删除,最后单次询问所有格子被删了几个 官方题解提到了两种有意思的做法,随机和二进 ...

  6. 2018牛客多校1 - J Different Integers 莫队/主席树签到

    题意:给出n<5e4,a[1...n],单次1e5总次1e6次查询除去区间(L,R)的数的个数 开场5分钟:莫队是不可能莫队的,这道题是不可能莫队的 最后1小时:真香 具体操作没啥特别的,注意一 ...

  7. 2018牛客多校第二场a题

    一个人可以走一步或者跳x步,但不能连着跳,问到这个区间里有几种走法 考虑两种状态  对于这一点,我可以走过来,前面是怎么样的我不用管,也可以跳过来但是,跳过来必须保证前一步是走的 dp[i][0]表示 ...

  8. 2018牛客多校第六场 G.Pikachu

    题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...

  9. 2018牛客多校第五场 H.subseq

    题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...

随机推荐

  1. ORACLE B-TREE(B树)索引

    内容简介: 1.普通B-TREE 索引; 2.唯一B-TREE 索引; 3.复合索引; ORACLE 默认的索引类型为B-TREE 索引,表中的行标识符(ROWID)和行相关的列值被存储在一个平衡树的 ...

  2. Sublime Text 2 安装配置插件

    最近学习python,看网上推荐用sublime text2挺方便,就学习了一下对sublime text2 安装插件,先放在这里,以备以后查找 根据晚上资料修改,原文请看这里 Python的自动补全 ...

  3. Spring框架总结(一)

    名词解释: 框架就是组件的集合.比如:Struts.Spring.Hibernate就是组件的集合 组件就是常用的功能包封装成工具类. 常用组件: Dom4j/Xpath.DBUtils.C3p0.B ...

  4. 【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 1. 设置计时溢出时间为1秒 2. 计数器位宽为32位 3. 勾选No Start/Stop control bits 4. 勾选F ...

  5. 一篇文章让你快速入门 学懂Shell脚本

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...

  6. jQUery 常用实例

    1. 如何创建嵌套的过滤器 //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器匹配的部分.在这种情况下, //查询删除了任何没(:not)有(:has) //包含class为“se ...

  7. [VSTO] warning CS0467 解决方案

    warning CS0467: Ambiguity between method 'Microsoft.Office.Interop.Word._Document.Close(ref object, ...

  8. Linux 下面screen命令的用法

            最近在使用阿里云的Linux 云服务做毕业设计遇到一些问题,我把java的jar运行程序上传之后,使用java -jar server命令之后程序开始正常运行,但是当我关闭终端的时候程 ...

  9. C# 异常日志记录

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web; na ...

  10. ASP 缓存处理及URL 重写

    1 缓存 1.1.1 <%--通过设置VaryByParam =" VaryByParam ="none" %> 1.1.2 <%--带参数缓存,只要包 ...