线段树+扫描线 NAIPC 2019 Intersecting Rectangles
你看看你有多菜,一点线段树的小小的运用,就不会写了;
题意:如果矩阵有交集,输出1,否则输出0(不包含内嵌);
思路:本题求交集,还得不包括内嵌的情况;
做过一道是求面积的题。跟这道类似,但在这里定义的方式跟那道题定的相反。
这里把下面的线定为了-1,上面定为了1;
在这道题里,先把矩阵的横向边按上下两种储存在一个结构体里,上的权值为1,下的为-1;
然后离散化这些坐标(为浮点数的时候和数太大的时候都要离散化,太大的话线段树放不下)
所以用离散化后的x1,x2去更新线段树;
当更新的边为下边的时候(权值为-1) 如果这个时候这个区间里已经有值了,证明相交;
当更新的边为上边的时候(权值为1) 如果这个时候这个区间里的值没有变为0,也证明相交;
#include<cstdio>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
const int maxn=2e5+;
int cnt1;
int cnt2,c[maxn];
struct node
{
int l,r,h,id;
}b[maxn];
struct Node
{
int l,r,sum;
}tree[maxn<<];
void init()
{
memset(c,,sizeof(c));
cnt1=cnt2=;
}
bool cmp(node x,node y)
{
return x.h<y.h;
}
void build(int l,int r,int root)
{
tree[root].l=l,tree[root].r=r;
tree[root].sum=;
if(l==r) return;
int mid=l+r>>;
build(l,mid,root<<);
build(mid+,r,root<<|);
}
void pushup(int root)
{
tree[root].sum=tree[root<<].sum+tree[root<<|].sum;
}
void update(int base,int key,int root)
{
int l=tree[root].l,r=tree[root].r;
if(l==r){
tree[root].sum+=key;
return;
}
int mid=l+r>>;
if(mid>=base) update(base,key,root<<);
else update(base,key,root<<|);
pushup(root);
}
int query(int L,int R,int root)
{
int l=tree[root].l,r=tree[root].r;
if(l>=L&&r<=R){
return tree[root].sum;
}
int mid=l+r>>;
int ans=;
if(mid>=L) ans+=query(L,R,root<<);
if(mid<R) ans+=query(L,R,root<<|);
return ans;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
init();
for(int i=;i<=n;i++){
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
b[++cnt1].l=x1,b[cnt1].r=x2,b[cnt1].h=y1,b[cnt1].id=-; //下边;
b[++cnt1].l=x1,b[cnt1].r=x2,b[cnt1].h=y2,b[cnt1].id=; //上边;
c[++cnt2]=x1; //离散化坐标的预处理;
c[++cnt2]=x2; //离散化坐标的预处理;
}
sort(c+,c++cnt2); //离散化
int len=unique(c+,c++cnt2)-c-;
for(int i=;i<=cnt1;i++){
b[i].l=lower_bound(c+,c++len,b[i].l)-c; //将离散化后的值存储起来
b[i].r=lower_bound(c+,c++len,b[i].r)-c;
}
sort(b+,b++cnt1,cmp); //从小到排序,这里的操作弄不太清楚,只知道这样子之后
//才能一步一步的去判断是否相交;
build(,cnt1,); //建树;
int flag=;
for(int i=;i<=cnt1;i++){
if(b[i].id==-){ //如果为下边
int tmp=query(b[i].l,b[i].r,);
if(tmp){
flag=;
break;
}
}
update(b[i].l,b[i].id,);
update(b[i].r,b[i].id,);
if(b[i].id==){
int tmp=query(b[i].l,b[i].r,);
if(tmp){
flag=;
break;
}
}
}
printf("%d\n",flag);
}
return ;
}
线段树+扫描线 NAIPC 2019 Intersecting Rectangles的更多相关文章
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- 【POJ-2482】Stars in your window 线段树 + 扫描线
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11706 Accepted: ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
随机推荐
- C++中局部变量的返回
在写 “根据中序和后序遍历顺序,构建树的问题” 时,原本这只是一个非常简单的问题,但是突然发现一直有错误.代码如下: node* get_root(int x1, int x2, int y1, in ...
- Eclipse的Errors in required projec(s)问题
在Eclipse中运行代码时出现Errors exist in required project(s)弹窗提示,但是当前类并无错误,点击Proceed当前类仍然可以运行 错误展示: Errors ex ...
- vm virtualbox 里的ubuntu挂载windows的文件夹
1.先在virtualbox里设置好共享文件夹 如右图所示: 共享文件夹-添加共享文件夹 里面: 选择好 共享文件夹路径,起好 共享文件夹名称,下面都不用选. 假设共享文件名是ShareD, 2. 然 ...
- mybatis一对多 多对一 多对多
https://blog.csdn.net/AdminGuan/article/details/98952484 Mybatis的Mapper该如何编写多对一? 很简单,就是在resultMap标 ...
- java基础之 java注释
JAVA里有2中注释风格. 一种以 "/*" 开始以 "*/" 结尾,另一种是以 "//" 起头的. 被注释的内容不会被java虚拟机编译, ...
- mybatis(五):源码分析 - mapper文件加载流程
- 牛客CSP-S提高组赛前集训营2 赛后总结
比赛链接 A.服务器需求 维护每天需要的服务器数量的全局最大值(记为\(Max\))和总和(记为\(sum\)),那么答案为: \[max(Max,\lceil\dfrac{sum}{m}\rceil ...
- 自己动手系列----使用数组实现一个简单的Map
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同.Java 语言中提供的数组是用来存储固定大小的同类型元素. 这里提一下,数组的优缺点: 优点: 1. 使用索 ...
- [HNOI2014] 道路堵塞 - 最短路,线段树
对不起对不起,辣鸡蒟蒻又来用核弹打蚊子了 完全ignore了题目给出的最短路,手工搞出一个最短路,发现对答案没什么影响 所以干脆转化为经典问题:每次询问删掉一条边后的最短路 如果删掉的是非最短路边,那 ...
- (转载)设置虚拟机桥接模式以及解决桥接模式上不了网以及ping不通主机的问题
解决问题的博客地址:设置虚拟机桥接模式以及解决桥接模式上不了网以及ping不通主机的问题 遇见的问题: 1.VMnet8无法设置为桥接模式 结论:只要主机网络可被桥接,VMnet8根本不需要设为桥接模 ...