poj 2528 线段树+离散化
题意:在墙上贴一堆海报(只看横坐标,可以抽象成一线段),新海报可以覆盖旧海报。求最后能看到多少张海报
sol:线段树成段更新。铺第i张海报的时候更新sg[i].x~sg[i].y这一段为i。
然而坐标范围有点大,还是加上离散化更靠谱些。
注意每组数据要清空数组,因为忘了清空WA了两发,太可惜了-_-||
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct
{
int l,r;
int dat;
}t[];
struct
{
int x,y;
}sg[];
char ch;
int md,num,ans,T,N,nnd;
bool v[];
int X[]; //建树:
void build(int l,int r,int o)
{
if (o>num) num=o;
t[o].l=l; t[o].r=r;
if (l==r)
t[o].dat=;
else
{
int mid=(l+r)/;
build(l,mid,*o);
build(mid+,r,*o+);
t[o].dat=;
}
} //push_down:(向下更新一层)
void push_down(int o)
{
if ((t[o].dat!=)&&(t[o].dat!=md))
{
t[o<<].dat=t[o].dat;
t[o<<|].dat=t[o].dat;
t[o].dat=;
}
} //更新:cin>>ml>>mr>>md; update(ml,mr,1); ->令a[ml..mr]=md
void update(int l,int r,int o)
{
if (o>num) return;
int tl=t[o].l,tr=t[o].r;
if ((tl==l)&&(tr==r))
{
t[o].dat=md;
return;
}
else
{
int mid=(tl+tr)>>;
//if (tl==tr) return;
push_down(o);
if (r<=mid)
update(l,r,o<<);
else if (l>mid)
update(l,r,o<<|);
else
{
update(l,mid,o<<);
update(mid+,r,o<<|);
}
}
} void sum(int o)
{
if (o>num) return;
if (t[o].l!=t[o].r) push_down(o);
if (t[o].dat!=)
{
if (!v[t[o].dat])
{
v[t[o].dat]=true;
ans++;
}
return;
}
sum(o<<);
sum(o<<|);
} int Bin(int key,int n,int X[])
{
int l = , r = n - ;
while (l <= r)
{
int m = (l + r) >> ;
if (X[m] == key) return m;
if (X[m] < key) l = m + ;
else r = m - ;
}
return -;
} int main()
{
cin>>T;
while(T--)
{
cin>>N;
nnd=;
memset(t,,sizeof(t));
memset(v,,sizeof(v));
for(int i=;i<=N;i++)
{
scanf("%d%d",&sg[i].x,&sg[i].y);
X[nnd++]=sg[i].x;
X[nnd++]=sg[i].y;
}
sort(X,X+nnd);
int m=;
for(int i=;i<nnd;i++)
if(X[i]!=X[i-]) X[m++]=X[i];
sort(X,X+m); //for(int i=0;i<m;i++)
// cout<<i<<"-"<<X[i]<<" ";
//cout<<endl; num=;
build(,m,);
for(int i=;i<=N;i++)
{
int tx=sg[i].x,ty=sg[i].y;
//cout<<tx<<" "<<ty<<"--";
tx=Bin(tx,m,X)+; ty=Bin(ty,m,X)+;
//cout<<tx<<" "<<ty<<endl;
md=i;
update(tx,ty,);
}
ans=;
sum(); cout<<ans<<endl; }
return ;
}
/*
现在再看去年这时候整理的线段树模板真是一坨屎。。。。
*/
poj 2528 线段树+离散化的更多相关文章
- poj 2528(线段树+离散化) 市长的海报
http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...
- POJ 2528 (线段树 离散化) Mayor's posters
离散化其实就是把所有端点放在一起,然后排序去个重就好了. 比如说去重以后的端点个数为m,那这m个点就构成m-1个小区间.然后给这m-1个小区间编号1~m-1,再用线段树来做就行了. 具体思路是,从最后 ...
- poj 2528 线段树 离散化的小技巧
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:直接搞超时+超内存,需要离散化.离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] ...
- Mayor's posters POJ - 2528(线段树 + 离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74745 Accepted: 21574 ...
- poj 2528 线段树区间修改+离散化
Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...
- Mayor's posters POJ - 2528 线段树(离散化处理大数?)
题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了). 思路:很明显就是线段树更改区间,不过这个区间的跨度有 ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...
- Mayor's posters POJ - 2528 线段树区间覆盖
//线段树区间覆盖 #include<cstdio> #include<cstring> #include<iostream> #include<algori ...
- POJ 2528 线段树
坑: 这道题的坐标轴跟普通的坐标轴是不一样的-- 此题的坐标轴 标号是在中间的-- 线段树建树的时候就不用[l,mid][mid,r]了(这样是错的) 直接[l,mid][mid+1,r]就OK了 D ...
随机推荐
- Android各种屏幕适配原理
dip(dp): device independent pixels(设备独立像素) dip,就是把屏幕的高分成480分,宽分成320分.比如你做一条160dip的横线,无论你在320还480的模拟器 ...
- mac:在当前文件夹打开terminal终端
System Preferences -> Keyboard -> Shortcuts -> Services -> New Terminal at Folders/New T ...
- JavaScript中正则表达式test()、exec()、match() 方法区别
1.test test 返回 Boolean,查找对应的字符串中是否存在模式.var str = "1a1b1c";var reg = new RegExp("1.&qu ...
- Oracle PL/SQL 入门
PL/SQL 全称:Procedure Language/SQL.产生背景自己去百度. 模板: Declare ---变量定义 num ; name ) := 'damon'; idesc cnt_i ...
- iptables实现负载均衡
例子: iptables -t nat -A PREROUTING -d 10.192.0.65/32 -p tcp -m tcp --dport 8080 -m statistic --mode n ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- ASP.NET MVC 关闭 客户端 xss 检查
为防止 XSS 攻击,asp.net 机制 会默认检测 请求报文 内是否有包含html标签,以提醒开发人员处理,报错如下:"从客户端中检测到有潜在危险的Request...值"当我 ...
- 从setTimeout谈JavaScript运行机制
从setTimeout说起 众所周知,JavaScript是单线程的编程,什么是单线程,就是说同一时间JavaScript只能执行一段代码,如果这段代码要执行很长时间,那么之后的代码只能尽情地等待它执 ...
- md5加密篇(一)
/// <summary> /// 获取文件的md5摘要 /// </summary> /// <param name="sFile">文件流& ...
- 面向OPENCL的ALTERA SDK
面向OPENCL的ALTERA SDK 使用面向开放计算语言 (OpenCL™) 的 Altera® SDK,用户可以抽象出传统的硬件 FPGA 开发流程,采用更快.更高层面的软件开发流程.在基于 x ...