CF369E Valera and Queries kdtree
给你一堆线段,求:一个区间内包含的本质不同线段种类数(只要线段有一部分在区间中就算是包含)
考虑容斥:总线段数-被那些没有询问的区间完全覆盖的数量.
用离线+树状数组数点或者 KDtree 数点即可.
- #include <bits/stdc++.h>
- #define N 300005
- using namespace std;
- void setIO(string s)
- {
- string in=s+".in";
- string out=s+".out";
- freopen(in.c_str(),"r",stdin);
- // freopen(out.c_str(),"w",stdout);
- }
- namespace kd
- {
- int d;
- struct node
- {
- int ch[2],p[2],minv[2],maxv[2],sum,w;
- }t[N];
- bool cmp(node a,node b)
- {
- return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];
- }
- int isin(int p,int x1,int y1,int x2,int y2)
- {
- return t[p].minv[0]>=x1&&t[p].maxv[0]<=x2&&t[p].minv[1]>=y1&&t[p].maxv[1]<=y2;
- }
- int isout(int p,int x1,int y1,int x2,int y2)
- {
- return t[p].maxv[0]<x1||t[p].minv[0]>x2||t[p].maxv[1]<y1||t[p].minv[1]>y2;
- }
- void pushup(int x,int y)
- {
- t[x].sum+=t[y].sum;
- for(int i=0;i<2;++i)
- {
- t[x].minv[i]=min(t[x].minv[i],t[y].minv[i]);
- t[x].maxv[i]=max(t[x].maxv[i],t[y].maxv[i]);
- }
- }
- int build(int l,int r,int o)
- {
- d=o;
- int mid=(l+r)>>1;
- nth_element(t+l,t+mid,t+1+r,cmp);
- for(int i=0;i<2;++i) t[mid].minv[i]=t[mid].maxv[i]=t[mid].p[i];
- t[mid].sum=1;
- t[mid].ch[0]=t[mid].ch[1]=0;
- if(mid>l) t[mid].ch[0]=build(l,mid-1,o^1),pushup(mid,t[mid].ch[0]);
- if(r>mid) t[mid].ch[1]=build(mid+1,r,o^1),pushup(mid,t[mid].ch[1]);
- return mid;
- }
- int query(int p,int x1,int y1,int x2,int y2)
- {
- if(isin(p,x1,y1,x2,y2)) return t[p].sum;
- if(isout(p,x1,y1,x2,y2)) return 0;
- int re=(t[p].p[0]>=x1&&t[p].p[0]<=x2&&t[p].p[1]>=y1&&t[p].p[1]<=y2);
- if(t[p].ch[0]) re+=query(t[p].ch[0],x1,y1,x2,y2);
- if(t[p].ch[1]) re+=query(t[p].ch[1],x1,y1,x2,y2);
- return re;
- }
- };
- namespace IO
- {
- char *p1,*p2,buf[100000];
- #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
- 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;}
- };
- int arr[N];
- int main()
- {
- // setIO("input");
- int n,m,i,j,root;
- n=IO::rd(),m=IO::rd();
- for(i=1;i<=n;++i)
- kd::t[i].p[0]=IO::rd(),kd::t[i].p[1]=IO::rd();
- // scanf("%d%d",&kd::t[i].p[0],&kd::t[i].p[1]);
- root=kd::build(1,n,0);
- for(i=1;i<=m;++i)
- {
- int k=IO::rd(),re=0;
- // scanf("%d",&k);
- for(j=1;j<=k;++j) arr[j]=IO::rd();
- arr[0]=0,arr[k+1]=1000002;
- for(j=0;j<=k;++j)
- {
- if(arr[j+1]>arr[j]+1)
- {
- re+=kd::query(root,arr[j]+1,arr[j]+1,arr[j+1]-1,arr[j+1]-1);
- }
- }
- printf("%d\n",n-re);
- }
- return 0;
- }
CF369E Valera and Queries kdtree的更多相关文章
- CF369E Valera and Queries
嘟嘟嘟 这题刚开始以为是一个简单题,后来越想越不对劲,然后就卡住了. 瞅了一眼网上的题解(真的只瞅了一眼),几个大字令人为之一振:正难则反! 没错,把点看成区间,比如2, 5, 6, 9就是[1, 1 ...
- [CF369E]Valera and Queries_离线_树状数组
Valera and Queries 题目链接:codeforces.com/problemset/problem/369/E 数据范围:略. 题解: 这种题,就单独考虑一次询问即可. 我们发现,包括 ...
- CodeForces - 369E Valera and Queries(树状数组)
CodeForces - 369E Valera and Queries 题目大意:给出n个线段(线段的左端点和右端点坐标)和m个查询,每个查询有cnt个点,要求给出有多少条线段包含至少其中一个点. ...
- Codeforces 369E Valera and Queries --树状数组+离线操作
题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点 解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询 ...
- Codeforces Round #216 (Div. 2) E. Valera and Queries 树状数组 离线处理
题意:n个线段[Li, Ri], m次询问, 每次询问由cnt个点组成,输出包含cnt个点中任意一个点的线段的总数. 由于是无修改的,所以我们首先应该往离线上想, 不过我是没想出来. 首先反着做,先求 ...
- cf E. Valera and Queries
http://codeforces.com/contest/369/problem/E 题意:输入n,m; n 代表有多少个线段,m代表有多少个询问点集.每一个询问输出这些点的集合所占的线段的个数. ...
- Codeforces Round #216 (Div. 2) E. Valera and Queries (BIT)
标题效果: 给很多分布 x 行轴. 然后给出了一个非常的多点集,问该组点分布多少不同段. IDEAS: 分散成多个线段点集的. 给出的线段的话,也就是说这个点集上不会有点在这条线段上. 所以我们就是求 ...
- Codeforces 396 E. Valera and Queries
题目链接:http://codeforces.com/problemset/problem/369/E 考虑将问题转化为有多少条线段没有覆盖这些点,如果一个询问的点集是${[x1,x2,...,xn] ...
- CF_216_Div_2
比赛链接:http://codeforces.com/contest/369 369C - Valera and Elections: 这是一个树上问题,用深搜,最开始贪心想得是只加叶子节点,找到一个 ...
随机推荐
- shiro是什么?
是什么? Shiro是一个非常强大的.易于使用的.开源的.权限框架.它包括了权限校验.权限授予.会话管理.安全加密等组件. 为什么要使用shiro? 如果你是需要设计RBAC(Role Based A ...
- 全栈项目|小书架|服务器开发-Koa全局路由实现
什么是路由 路由就是具体的访问路径,指向特定的功能模块.一个api接口是由ip(域名)+端口号+路径组成,例如 :https://www.npmjs.com/package/koa-router就是一 ...
- java 读取文件流
搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStre ...
- win7 ReadyBoot 文件位置修改
右键我的电脑,依次点开系统工具-性能-数据收集器集-系统-事件跟踪会话 在右边找到ReadyBoot,右键打开属性,会话框上方选择文件,根据示例文件名的路径找到ReadyBoot.etl文件,复制到你 ...
- ubuntu16.04环境下在docker上部署javaweb项目简单案例
因为一些原因,接触到了docker,经过一番研究,总算是有了一些自己的看法,有什么不对的地方,希望多多指教. 废话不多说,首先我这里使用的虚拟机安装的是ubuntu16.04版本,其他版本应该也可以. ...
- 【转载】 Asp.Net MVC网站提交富文本HTML标签内容抛出异常
今天开发一个ASP.NET MVC网站时,有个页面使用到了FCKEditor富文本编辑器,通过Post方式提交内容时候抛出异常,仔细分析后得出应该是服务器阻止了带有HTML标签内容的提交操作,ASP. ...
- Canvas 绘制一个像素风电子时钟
想法是在 Canvas 上绘制由小方块组成的数字. 第一步是实现绘制小方块的方法,先画出一个边长为 5 的 10x10 个方块,使用两个 for 循环很简单就能完成. for (let i = 0; ...
- python day1 python介绍,安装及运算符
目录 python day1 1. 不同编程语言的对比 2. 为什么学python? 3. python的种类 4. python的安装(windows系统) 5. 导入模块或包 6. pyc文件 7 ...
- setTimeout()方法和setInterval()方法
setTimeout方法: 定义和用法: setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. tip: 1000 毫秒= 1 秒. tip: 如果你只想重复执行可以使用setI ...
- stm32 SPI-FLASH W25Q64
The W25Q64BV array is organized into 32,768 programmable pages of 256-bytes each. Up to 256 bytes ca ...