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 ...
随机推荐
- wait(), notify(),sleep详解
在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的 ...
- [转]JDE910--jas.ini参数说明
配置 jas.ini 文件 jas.ini 文件可以使用 Java™ Application Server (JAS) 来提供 JDE 安装的配置.您必须针对特定于每个环境的 JDE 实例来配置 ja ...
- 数据库与SQL语言
数据库(DB) :长期储存在计算机中.有组织.可共享的数据的集合. 特点:(1)数据按一定的数据模型组织.描述和储存:(2)较小的冗余度:(3)数据独立性较高:(4)易扩展:(5)可共享(不同用户可按 ...
- 实现IEnumberable接口和IEnumberator
class BookEnum : IEnumerator //实现foreach语句内部,并派生 { public Book[] _book; //实现数组 ;//设置“指针” public Book ...
- ACTIVITI 源码研究之命令模式执行
ACTIVITI 是一个优秀开源软件,通过阅读源码,我们不但可以了解工作流引擎执行的原理还可以增加个人的编码功力. ACTIVITI 所有执行过程都是采用命令模式进行执行. 本文主要描述流程引擎数据保 ...
- C#基础学习文章导航
第一部分:入个门 C#入门篇-1:HelloWorld的类 C#入门篇-2:什么是变量 C#入门篇-3:数据类型及转换 C#入门篇-4:使用运算符 第二部分:流程控制语句 C#入门篇5-1:流程控制语 ...
- C#拉姆达(=>)表达式
前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(=>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似 ...
- HDU 3074 Multiply game(线段树)
单点更新,更新时先除去 原来的数,因为有去摸,可以用乘上逆元代替. //================================================================ ...
- 虚拟机的apache服务器不能被主机访问的问题
我在centos虚拟机上安装了elasticsearch服务,虚拟机里测试正常,但主机却无法访问elasticsearch.要说的是,虚拟机采用桥接模式,与主机相互ping得通. 后来查了资料发现,这 ...
- 6.1.1Linux下Socket编程
什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...