你看看你有多菜,一点线段树的小小的运用,就不会写了;

题意:如果矩阵有交集,输出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的更多相关文章

  1. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. hdu1542 Atlantis (线段树+扫描线+离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  4. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  5. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  6. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  7. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  8. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  9. BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤

    3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...

随机推荐

  1. 查看Spark与Hadoop等其他组件的兼容版本

    安装与Spark相关的其他组件的时候,例如JDK,Hadoop,Yarn,Hive,Kafka等,要考虑到这些组件和Spark的版本兼容关系.这个对应关系可以在Spark源代码的pom.xml文件中查 ...

  2. Codeforces Round #623 (Div. 2) D.Recommendations 并查集

    ABC实在是没什么好说的,但是D题真的太妙了,详细的说一下吧 首先思路是对于a相等的分类,假设有n个,则肯定要把n-1个都增加,因为a都是相等的,所以肯定是增加t小的分类,也就是说每次都能处理一个分类 ...

  3. 安装 centos8.1

    阿里云镜像下载链接 http://mirrors.aliyun.com/centos/8.1.1911/isos/x86_64/ 选择 CentOS-8.1.1911-x86_64-dvd1.iso ...

  4. 转载:openmax bellagio

    https://wenku.baidu.com/view/18472c1387c24028915fc3e9.html https://wenku.baidu.com/view/1e380bc20c22 ...

  5. AntDesign(React)学习-12 使用Table

    AntDesign(Vue)版的Table中使用图片https://www.cnblogs.com/zhaogaojian/p/11119762.html 之前在使用VUE版Table时,使用大图片时 ...

  6. QT安装和vs2015使用

    下载Qt5.7.0安装包(qt-windows-opensource)与Qt插件(Visual Studio Add-in) QT软件下载地址: http://download.qt.io/archi ...

  7. excel用xlrd日期变成42631.0

    datetime的解决办法混合数据的表中有个日期:2016/9/18 通过table.row_values(row_number)[1]读取时,显示的结果为:42631.0 查看row_values方 ...

  8. Linux内核源码阅读记录一之分析存储在不同段中的函数调用过程

    在写驱动的过程中,对于入口函数与出口函数我们会用一句话来修饰他们:module_init与module_exit,那会什么经过修饰后,内核就能狗调用我们编写的入口函数与出口函数呢?下面就来分析内核调用 ...

  9. 【NOIP2001普及组】最大公约数和最小公倍数问题

    P1029 最大公约数和最小公倍数问题 最大公约数用辗转相除法: 最小公倍数:两个数的乘积=他们的最大公约数*最小公倍数,既然两个数的乘积及其最大公约数已知,那么最小公倍数也可以求了. #includ ...

  10. Whctf 2017 -UNTITLED- Writeup

    Whctf 2017 -UNTITLED- Writeup 转载请表明出处http://www.cnblogs.com/WangAoBo/p/7541481.html 分析: 下载下来的附件是一个py ...