给你一堆线段,求:一个区间内包含的本质不同线段种类数(只要线段有一部分在区间中就算是包含)

考虑容斥:总线段数-被那些没有询问的区间完全覆盖的数量.

用离线+树状数组数点或者 KDtree 数点即可.

  1. #include <bits/stdc++.h>
  2. #define N 300005
  3. using namespace std;
  4. void setIO(string s)
  5. {
  6. string in=s+".in";
  7. string out=s+".out";
  8. freopen(in.c_str(),"r",stdin);
  9. // freopen(out.c_str(),"w",stdout);
  10. }
  11. namespace kd
  12. {
  13. int d;
  14. struct node
  15. {
  16. int ch[2],p[2],minv[2],maxv[2],sum,w;
  17. }t[N];
  18. bool cmp(node a,node b)
  19. {
  20. return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];
  21. }
  22. int isin(int p,int x1,int y1,int x2,int y2)
  23. {
  24. return t[p].minv[0]>=x1&&t[p].maxv[0]<=x2&&t[p].minv[1]>=y1&&t[p].maxv[1]<=y2;
  25. }
  26. int isout(int p,int x1,int y1,int x2,int y2)
  27. {
  28. return t[p].maxv[0]<x1||t[p].minv[0]>x2||t[p].maxv[1]<y1||t[p].minv[1]>y2;
  29. }
  30. void pushup(int x,int y)
  31. {
  32. t[x].sum+=t[y].sum;
  33. for(int i=0;i<2;++i)
  34. {
  35. t[x].minv[i]=min(t[x].minv[i],t[y].minv[i]);
  36. t[x].maxv[i]=max(t[x].maxv[i],t[y].maxv[i]);
  37. }
  38. }
  39. int build(int l,int r,int o)
  40. {
  41. d=o;
  42. int mid=(l+r)>>1;
  43. nth_element(t+l,t+mid,t+1+r,cmp);
  44. for(int i=0;i<2;++i) t[mid].minv[i]=t[mid].maxv[i]=t[mid].p[i];
  45. t[mid].sum=1;
  46. t[mid].ch[0]=t[mid].ch[1]=0;
  47. if(mid>l) t[mid].ch[0]=build(l,mid-1,o^1),pushup(mid,t[mid].ch[0]);
  48. if(r>mid) t[mid].ch[1]=build(mid+1,r,o^1),pushup(mid,t[mid].ch[1]);
  49. return mid;
  50. }
  51. int query(int p,int x1,int y1,int x2,int y2)
  52. {
  53. if(isin(p,x1,y1,x2,y2)) return t[p].sum;
  54. if(isout(p,x1,y1,x2,y2)) return 0;
  55. int re=(t[p].p[0]>=x1&&t[p].p[0]<=x2&&t[p].p[1]>=y1&&t[p].p[1]<=y2);
  56. if(t[p].ch[0]) re+=query(t[p].ch[0],x1,y1,x2,y2);
  57. if(t[p].ch[1]) re+=query(t[p].ch[1],x1,y1,x2,y2);
  58. return re;
  59. }
  60. };
  61. namespace IO
  62. {
  63. char *p1,*p2,buf[100000];
  64. #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
  65. int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
  66. };
  67. int arr[N];
  68. int main()
  69. {
  70. // setIO("input");
  71. int n,m,i,j,root;
  72. n=IO::rd(),m=IO::rd();
  73. for(i=1;i<=n;++i)
  74. kd::t[i].p[0]=IO::rd(),kd::t[i].p[1]=IO::rd();
  75. // scanf("%d%d",&kd::t[i].p[0],&kd::t[i].p[1]);
  76. root=kd::build(1,n,0);
  77. for(i=1;i<=m;++i)
  78. {
  79. int k=IO::rd(),re=0;
  80. // scanf("%d",&k);
  81. for(j=1;j<=k;++j) arr[j]=IO::rd();
  82. arr[0]=0,arr[k+1]=1000002;
  83. for(j=0;j<=k;++j)
  84. {
  85. if(arr[j+1]>arr[j]+1)
  86. {
  87. re+=kd::query(root,arr[j]+1,arr[j]+1,arr[j+1]-1,arr[j+1]-1);
  88. }
  89. }
  90. printf("%d\n",n-re);
  91. }
  92. return 0;
  93. }

  

CF369E Valera and Queries kdtree的更多相关文章

  1. CF369E Valera and Queries

    嘟嘟嘟 这题刚开始以为是一个简单题,后来越想越不对劲,然后就卡住了. 瞅了一眼网上的题解(真的只瞅了一眼),几个大字令人为之一振:正难则反! 没错,把点看成区间,比如2, 5, 6, 9就是[1, 1 ...

  2. [CF369E]Valera and Queries_离线_树状数组

    Valera and Queries 题目链接:codeforces.com/problemset/problem/369/E 数据范围:略. 题解: 这种题,就单独考虑一次询问即可. 我们发现,包括 ...

  3. CodeForces - 369E Valera and Queries(树状数组)

    CodeForces - 369E Valera and Queries 题目大意:给出n个线段(线段的左端点和右端点坐标)和m个查询,每个查询有cnt个点,要求给出有多少条线段包含至少其中一个点. ...

  4. Codeforces 369E Valera and Queries --树状数组+离线操作

    题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点 解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询 ...

  5. Codeforces Round #216 (Div. 2) E. Valera and Queries 树状数组 离线处理

    题意:n个线段[Li, Ri], m次询问, 每次询问由cnt个点组成,输出包含cnt个点中任意一个点的线段的总数. 由于是无修改的,所以我们首先应该往离线上想, 不过我是没想出来. 首先反着做,先求 ...

  6. cf E. Valera and Queries

    http://codeforces.com/contest/369/problem/E 题意:输入n,m; n 代表有多少个线段,m代表有多少个询问点集.每一个询问输出这些点的集合所占的线段的个数. ...

  7. Codeforces Round #216 (Div. 2) E. Valera and Queries (BIT)

    标题效果: 给很多分布 x 行轴. 然后给出了一个非常的多点集,问该组点分布多少不同段. IDEAS: 分散成多个线段点集的. 给出的线段的话,也就是说这个点集上不会有点在这条线段上. 所以我们就是求 ...

  8. Codeforces 396 E. Valera and Queries

    题目链接:http://codeforces.com/problemset/problem/369/E 考虑将问题转化为有多少条线段没有覆盖这些点,如果一个询问的点集是${[x1,x2,...,xn] ...

  9. CF_216_Div_2

    比赛链接:http://codeforces.com/contest/369 369C - Valera and Elections: 这是一个树上问题,用深搜,最开始贪心想得是只加叶子节点,找到一个 ...

随机推荐

  1. shiro是什么?

    是什么? Shiro是一个非常强大的.易于使用的.开源的.权限框架.它包括了权限校验.权限授予.会话管理.安全加密等组件. 为什么要使用shiro? 如果你是需要设计RBAC(Role Based A ...

  2. 全栈项目|小书架|服务器开发-Koa全局路由实现

    什么是路由 路由就是具体的访问路径,指向特定的功能模块.一个api接口是由ip(域名)+端口号+路径组成,例如 :https://www.npmjs.com/package/koa-router就是一 ...

  3. java 读取文件流

    搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStre ...

  4. win7 ReadyBoot 文件位置修改

    右键我的电脑,依次点开系统工具-性能-数据收集器集-系统-事件跟踪会话 在右边找到ReadyBoot,右键打开属性,会话框上方选择文件,根据示例文件名的路径找到ReadyBoot.etl文件,复制到你 ...

  5. ubuntu16.04环境下在docker上部署javaweb项目简单案例

    因为一些原因,接触到了docker,经过一番研究,总算是有了一些自己的看法,有什么不对的地方,希望多多指教. 废话不多说,首先我这里使用的虚拟机安装的是ubuntu16.04版本,其他版本应该也可以. ...

  6. 【转载】 Asp.Net MVC网站提交富文本HTML标签内容抛出异常

    今天开发一个ASP.NET MVC网站时,有个页面使用到了FCKEditor富文本编辑器,通过Post方式提交内容时候抛出异常,仔细分析后得出应该是服务器阻止了带有HTML标签内容的提交操作,ASP. ...

  7. Canvas 绘制一个像素风电子时钟

    想法是在 Canvas 上绘制由小方块组成的数字. 第一步是实现绘制小方块的方法,先画出一个边长为 5 的 10x10 个方块,使用两个 for 循环很简单就能完成. for (let i = 0; ...

  8. python day1 python介绍,安装及运算符

    目录 python day1 1. 不同编程语言的对比 2. 为什么学python? 3. python的种类 4. python的安装(windows系统) 5. 导入模块或包 6. pyc文件 7 ...

  9. setTimeout()方法和setInterval()方法

    setTimeout方法: 定义和用法: setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. tip: 1000 毫秒= 1 秒. tip:  如果你只想重复执行可以使用setI ...

  10. stm32 SPI-FLASH W25Q64

    The W25Q64BV array is organized into 32,768 programmable pages of 256-bytes each. Up to 256 bytes ca ...