HDU 5820 (可持久化线段树)
Problem Lights (HDU 5820)
题目大意
在一个大小为50000*50000的矩形中,有n个路灯。(n<=500000)
询问是否每一对路灯之间存在一条道路,使得长度为|x1 – x2| + |y1 – y2|且每个拐弯点都是路灯。
解题分析
官方题解:

除了从左往右扫描一遍外,个人认为还需从右往左扫描一遍,记录右上方的点的信息。 实际实现时,只需将整个图左右对称翻转一下即可。
学习了一下可持久化线段树的正确姿势。
可持久化线段树的空间一定要开大,开大,开大。
下图为模拟的小数据可持久化线段树的构造。

参考程序
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std; #define N 1000008
#define M 50008
#define LL long long
#define lson l,m,rt<<1
#define rson m,r+1,rt<<1|1
#define clr(x,v) memset(x,v,sizeof(x)); const int mo = ;
const int inf = 0x3f3f3f3f;
const int INF = ;
/**************************************************************************/
struct node{
int x,y;
bool operator < (const node &b) const {
return x<b.x || x==b.x && y<b.y;
}
node(int x=,int y=):x(x),y(y){}
}a[N];
int n,flag;
map<pair<int,int>,int> Mpp; int mx[M],my[M]; int cnt;
int sum[N<<],ls[N<<],rs[N<<];
int root[M]; void dfs(int rt,int l,int r){
if (rt==) return;
printf("%d %d %d %d\n",rt,l,r,sum[rt]);
if (l==r) return;
int m=(l+r)/;
dfs(ls[rt],l,m);
dfs(rs[rt],m+,r);
}
void debug(){
printf("====================\n");
dfs(root[],,);
printf("\n");
dfs(root[],,);
printf("\n");
dfs(root[],,);
printf("\n");
dfs(root[],,);
printf("====================\n");
}
void pushup(int rt){
int l=ls[rt],r=rs[rt];
sum[rt]=sum[l]+sum[r];
}
void build(int &rt,int l,int r){
rt=++cnt;
sum[rt]=;
if (l==r) return;
int m=(l+r)/;
build(ls[rt],l,m);
build(rs[rt],m+,r);
pushup(rt);
}
void update(int pos,int val,int x,int &y,int l,int r){
y=++cnt;
if (l==r){
sum[y]=sum[x]+val;
return;
}
ls[y]=ls[x]; rs[y]=rs[x];
int m=(l+r)/;
if (pos <= m) update(pos,val,ls[x],ls[y],l,m);
if (m < pos) update(pos,val,rs[x],rs[y],m+,r);
pushup(y);
} int query(int L,int R,int rt,int l,int r){
if (L<=l && r<=R){
return sum[rt];
}
int m=(l+r)/;
int res=;
if (L <= m) res+=query(L,R,ls[rt],l,m);
if (m < R) res+=query(L,R,rs[rt],m+,r);
return res;
} void work1(){
clr(mx,); clr(my,);
cnt=;
build(root[],,);
int last=root[];
for (int i=;i<=n;i++){
int x1=a[i].x , y1=a[i].y;
int x2=a[my[y1]].x , y2=a[mx[x1]].y;
update(y1,,last,root[x1],,);
int k1=query(y2+,y1,root[x1],,);
int k2=query(y2+,y1,root[x2],,);
if (k1!=k2+) { flag=; return; }
mx[a[i].x]=i; my[a[i].y]=i; last=root[x1];
}
} int main(){
int T;
while (~scanf("%d",&n)){
if (n==) break;
Mpp.clear();
int num=;
for (int i=;i<=n;i++){
int x,y;
scanf("%d %d",&x,&y);
if (Mpp[make_pair(x,y)]==){
num++;
}
else
{
Mpp[make_pair(x,y)]=;
a[i-num].x=x;
a[i-num].y=y;
}
}
n=n-num;
sort(a+,a+n+);
flag=;
work1();
for (int i=;i<=n;i++) a[i].x=-a[i].x;
sort(a+,a+n+);
work1();
printf("%s\n",flag ? "YES" : "NO" );
}
}
/*
5
1 1
1 2
1 3
2 1
3 3
*/
HDU 5820 (可持久化线段树)的更多相关文章
- HDU 4866 Shooting(持久化线段树)
view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...
- HDU 5919 Sequence II(可持久化线段树)
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和
To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
- POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)
可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总 ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- HDU 4348 To the moon(可持久化线段树)
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
随机推荐
- Thread 总结
进程:是一个正在执行的程序 每一个进程执行都有一个执行顺序.该顺序是一个执行路劲,后者叫一个控制单元. 线程:就是进程中的一个独立控制单元. 线程在控制着进程的执行 一个进程中至少有个一个线程 Jav ...
- R-Studio
R-Studio是一个功能强大.节省成本的反删除和数据恢复软件系列.它采用独特的数据恢复新技术,为恢复FAT12/16/32.NTFS.NTFS5(由 Windows 2000/XP/2003/Vis ...
- easyui中的combobox小知识点~~
一直使用的easyui中,一些不为人知的小知识点,与君共勉: 1.combobox设置高度:使用panelHeight属性: 2.combobox本身自带“自动补全”功能,但是在浏览器中是有限制的,在 ...
- BZOJ1576 [Usaco2009 Jan]安全路经Travel
首先用Dijkstra做出最短路生成树,设dis[p]为1到p点的最短路长度 对于一条不在生成树上的边u -> v,不妨设fa为u.v的lca 则一fa到v的路径上的任意点x都可以由u达到,走的 ...
- 7款适用老旧设备并对初学者非常友好的轻量级Linux发行版
我们由从 7 到 1 的顺序向大家介绍. 7. Linux Lite 正如其名,Linux Lite 是 Linux 发行版的一个轻量级版本,用户并不需要强大的硬件就可以将它跑起来,而且其使用非常简单 ...
- 一看就懂的ReactJs入门教程(精华版)
一看就懂的ReactJs入门教程(精华版) 现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和 ...
- Java异常--读书笔记
1. Java将异常分为两种:Checked异常和Runtime异常,Java认为Checked异常都是可以在编译阶段被处理的异常,所以强制程序处理所有的Checked异常:Runtime异常则无需处 ...
- [开发笔记]-获取歌曲ID3信息
ID3介绍: ID3,一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版. 获 ...
- NOIP 2013 提高组 day1 T2 火柴排队 归并 逆序对
描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2∑i=1n(ai−bi) ...
- java.net.SocketException: Too many open files
1.ps -ef|grep java 2.lsof -p 32636 3.lsof -p 20812|wc –l 这个也可以看一个进程打开的文件数 4.ulimit –a c3p0官方提供了两个参 ...