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 ...
随机推荐
- 模拟器的tableView的分割线不显示
只有iOS9和iPhone6 plus模拟器上TableView分割线不会显示. 原因: 由于iPhone6 plus的分辨率较高,开发的时候同常都使用command + 3 或者 command + ...
- struts2视频学习笔记 24-27(国际化)
课时24 配置国际化全局资源文件.输出国际化信息 1.准备资源文件,添加到src目录下,资源文件的命名格式如下:baseName_language_country.propertiesbaseName ...
- 用js实现返回上一页
<a href="javascript :;" onClick="javascript :history.back(-1);">返回上一页</ ...
- [python学习]结合开源库学习python
代码碎片1 #!/usr/bin/python # please add your code here! import matplotlib matplotlib.use('Agg') import ...
- oracle之to_char,to_date用法
[转载自]http://www.jb51.net/article/45591.htm 这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星 ...
- 小记:获取系统时间的long值,格式化成可读时间。
/** * 返回的字符串形式是形如:2013年10月20日 20:58 * */ public static String formatTimeInMillis(long timeInMillis) ...
- 检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下:
检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下: 第 一步:首先将msvcr71.dll, SQLD ...
- C++-前缀和后缀
1,c++规定后缀形式的++操作符有一个int行的参数,被调用时,编译器自动加一个0作为参数给他 2,前缀返回一个reference,后缀返回一个const对象 /////////////////// ...
- 屏蔽Win10升级通知方法
对于有系统洁癖的我来说,不喜欢还原和自动升级,我更乐意使用全新安装的方式来装系统! 据说微软也知道这种方式有时候的确很讨人嫌,因此就低调的在美国微软社区中给出了屏蔽这项通知的官方"大法&qu ...
- android listview综合使用示例_结合数据库操作和listitem单击长按等事件处理
本示例说明: 1.自定义listview条目样式,自定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,并且操作后listview自动刷新. 3.响应用户操作点击事 ...