zoj 3888 线段树 ***
2015-08-17 18:29
316 查看
卡n^2,用线段树降到nlogn
记录每个点上所覆盖线段的次小值,保证能有两条路径能走
记录每个点上所覆盖线段的次小值,保证能有两条路径能走
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 const int INF=0x3f3f3f3f; const double eps=1e-5; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define root 1,n,1 #define mid ((l+r)>>1) typedef long long ll; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("*****\n"); const int N=51005; int n,m,tt; int a[N<<4],b[N<<4]; void pushdown(int rt) { //printf("pd:%d %d %d\n",a[rt],b[rt],rt); if(b[rt]!=9999999) { if(b[rt]>=a[rt<<1]&&b[rt]<b[rt<<1]) { b[rt<<1]=b[rt]; } if(b[rt]<a[rt<<1]) { a[rt<<1]=b[rt<<1]; a[rt<<1]=b[rt]; } if(b[rt]>=a[rt<<1|1]&&b[rt]<b[rt<<1|1]) { b[rt<<1|1]=b[rt]; } if(b[rt]<a[rt<<1|1]) { b[rt<<1|1]=a[rt<<1|1]; a[rt<<1|1]=b[rt]; } b[rt]=9999999; } /*if(rt==4) { printf("%d %d\n",a[rt<<1],b[rt<<1]); }*/ if(a[rt]!=9999999) { if(a[rt]>=a[rt<<1]&&a[rt]<b[rt<<1]) { b[rt<<1]=a[rt]; } if(a[rt]<a[rt<<1]) { b[rt<<1]=a[rt<<1]; a[rt<<1]=a[rt]; } if(a[rt]>=a[rt<<1|1]&&a[rt]<b[rt<<1|1]) { b[rt<<1|1]=a[rt]; } if(a[rt]<a[rt<<1|1]) { b[rt<<1|1]=a[rt<<1|1]; a[rt<<1|1]=a[rt]; } a[rt]=9999999; } //printf("%d %d ++%d++\n",a[rt<<1],b[rt<<1],rt<<1); } void build(int l,int r,int rt) { a[rt]=b[rt]=9999999; if(l==r) { a[rt]=b[rt]=l; return; } build(lson); build(rson); } void update(int L,int R,int val,int l,int r,int rt) { if(l>=L&&r<=R) { int x=val; if(b[rt]>x&&x>a[rt]) { b[rt]=x; } if(x<b[rt]) { b[rt]=a[rt]; a[rt]=x; } return; } pushdown(rt); if(L<=mid) update(L,R,val,lson); if(R>mid) update(L,R,val,rson); } int query(int pos,int l,int r,int rt) { //printf("%d %d %d %d %d\n",a[rt],b[rt],l,r,rt); if(l==r) { return b[rt]; } pushdown(rt); if(pos<=mid) return query(pos,lson); else return query(pos,rson); } int main() { int i,j,k,ca=1,q; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif while(scanf("%d%d%d",&n,&m,&q)!=EOF) { int x,y; build(root); for(i=0;i<m;i++) { scanf("%d%d",&y,&x); update(x,y,x,root); //记录次小x } while(q--) { scanf("%d",&x); printf("%d\n",x-query(x,root)); } } }
相关文章推荐
- css中padding和margin的区别
- 合法IP
- 剑指offer 34_丑数
- 使用ssh-keygen和 e022 ssh-copy-id三步实现SSH无密码登录
- 使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录
- 详解HTML5中的<aside>元素与<article>元素
- 修改Windows触摸屏操作模式
- TCP有限状态机转换
- Android:将数据存到文件中,DDMS无法查看/data目录
- SELinux深入理解
- Linux下安装了MySQL之后,无法用navicat连接数据库?
- centos 下 KVM虚拟机的创建、管理与迁移
- SpringTest(一)
- requireJs杂项
- HDOJ 2717 Catch That Cow【BFS】
- MSSQL:从ICLassFactory 为 CLSID的COM组建创建实例失败:c001f011
- 【Java并发编程实战】—–“J.U.C”:ReentrantLock之一简介
- soc与cpu区别
- 十宗罪 第1节
- String,StringBuffer和StringBuilder的区别