线段树+扫描线 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 ...
随机推荐
- Python-Django学习笔记(三)-Model模型的编写以及Oracle数据库的配置
Django使用的 MTV 设计模式(Models.Templates.Views) 因此本节将围绕这三部分并按照这个顺序来创建第一个页面 模型层models.py 模型是数据唯一而且准确的信息来源. ...
- Wannafly Camp 2020 Day 1A 期望逆序对 - 概率期望
分类讨论即可 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 5005; ...
- wso2 使用配置
1.下载wso2 https://docs.wso2.com 2.配置 https://172.10.0.59:9443/publisher https://172.10.0.59:9443/carb ...
- php Allowed memory size of 134217728 bytes exhausted
报错:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in ...
- POI题解整合
我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...
- Python开发坦克大战
Python不仅能开发网站,爬虫数据分析等,他其实也可以写游戏,接下来就给大家分享下坦克大战的代码: PS:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此 ...
- idea 配置 tomcat 教程
最近在搞一个项目需要用到idea 配置tomcat,翻了翻网上的帖子发现稂莠不齐,最后决定还是自己写个吧!(其实我挺蠢的走了好多的弯路,哎~) 1.首先准备一个需要大家tomcat的工程,然后使用id ...
- pandas处理csv,分组统计
需求: /tmp/demo/data下有10个csv文件,按col0和col1分组分别统计col2和col3总和并计算col2和col3的商 # encoding:utf-8 import panda ...
- 利用Marshal来管理非托管资源
void MarshalChartDemo() { string name = "xuwei"; IntPtr pName = Marshal.AllocHGlobal(name. ...
- selenium 百度登录
private String baseUrl="http://www.baidu.com/"; --------- @Test public void testLoginB() t ...