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 (可持久化线段树)的更多相关文章

  1. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  2. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

  3. 主席树[可持久化线段树](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 ...

  4. 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 ...

  5. 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 ...

  6. HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和

    To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

  7. POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)

    可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总 ...

  8. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  9. HDU 4348 To the moon(可持久化线段树)

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

随机推荐

  1. MVC中处理Json和JS中处理Json对象

    MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...

  2. IO流--复制picture ,mp3

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import ...

  3. 史上最用心的 iOS App 上架流程

    题记 麻痹起来嗨!看网上那么多的教程,依然在我心爱的爱屁屁在上架的时候遇到各种 J8 问题,最大的问题就是:Xcode 证书什么的,Provisioning Profile 什么的,Debug 什么的 ...

  4. Ansible :一个配置管理和IT自动化工具

    编译文章:LCTT  https://linux.cn/article-4215-1.html 译者: felixonmars 文章地址:https://linux.cn/article-4215-1 ...

  5. 5月4日课堂内容:for循环的穷举、迭代

    一.for循环拥有两类: 1.穷举: 把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. 2.迭代: 从初始情况按照规律不断求解中间情况,最终推导出结果. 二.穷举练习 1.单位给发了一张 ...

  6. Facebook 内部高效工作PPT

    Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下26张PPT的分享将为您带来时间价值管理的技巧. ...

  7. 学习记录012-NFS

    1.Network file System 主要是通过网络让不同的主机进行通信,构建于ip协议之上的现代文件系统,用来存储共享视频,图片,文件等 2.并发大的时候会有点问题(维护不好会丢数据) 3.N ...

  8. PHP+socket游戏数据统计平台发包接包类库

    <?php /** * @title: PHP+socket游戏数据统计平台发包接包类库 * @version: 1.0 * @author: perry <perry@1kyou.com ...

  9. Python的神奇方法指南

    参考:http://article.yeeyan.org/view/311527/287706

  10. 再谈IT行业工程师文化

    为什么是再呢?因为“工程师文化”这种说法网上很多,各种理解,各种版 本,我只是简单说说我的认识,说的不对的地方敬请各位大牛,高手,高高手多多指教,我本身也是个技术人员,不过只是技术不怎么样而已.写这个 ...