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

题意:如果矩阵有交集,输出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. [Python]BeautifulSoup安装与使用

    1.BeautifulSoup简介 BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据 ...

  2. python2.6升级python2.7后,yum不能用了,如何解决

    背景: 跑python的case时候,发现log功能不好用,于是升级了python2.6-->python2.7 but,升级之后,发现yum命令不好用了.怎么办? 百度搜了一下,如何解决: 参 ...

  3. K3/Cloud 执行计划任务错误排查

    计划任务的不执行原因可能有: 1.K3CloudJobProcess服务处于停止状态. 2.数据中心未勾选“允许执行计划任务”. 这种情况此数据中心下的所有计划任务都不会执行到. 3.第一次加进计划任 ...

  4. PP: Shape and time distortion loss for training deep time series forecasting models

    Problem: time series forecasting Challenge: forecasting for non-stationary signals and multiple futu ...

  5. phpstorm格式化数组

    如果我们想要的这样的数组格式的话,可以设置 <?php $arr = array["a" => 0, "b" => 1, "c&qu ...

  6. C++——字符串处理

    11.用字符数组存储和处理字符串 字符数组的声明和引用  字符串: 字符串常量 “china”,没有字符串变量,用字符数组来存放字符串,字符串以‘\0’结束. 字符串数组的初始化: 逐个输出输入字符串 ...

  7. 155.XSS攻击原理

    XSS攻击: XSS(Cross Site Script)攻击叫做跨站脚本攻击,他的原理是用户使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意 ...

  8. phpstorm实用技巧

    1.切换php代码版本提示 1.1找到External Libraries右键点击(configure PHP Include Paths) 1.2切换提示版本(在这里切换版本)确定即可 2.生成ge ...

  9. Codeforces Round #601 (Div. 2) C League of Leesins

    把每一次输入的一组数字存下来,然后把每个数字出现的组数存下来 然后找只出现过一次的数字a,那么这个数字a不是开头就是结尾,默认为开头(是哪个都无所谓),然后去找和它出现在同一组的两个数字b和c,而b和 ...

  10. EF的预先加载--Eager Loading

    预先加载 在对一种类型的实体进行查询时,将相关的实体作为查询的一部分一起加载.预先加载可以使用Include()方法实现. 在此需要说明的是:EF中有两种表关联的方法,一种是Join()方法,一种是I ...