CodeForces 269D
来源:互联网 发布:医疗器械软件描述范例 编辑:程序博客网 时间:2024/06/09 21:46
线段树+dfs暴力更新
线段树维护区间最高值,
dfs区间询问
每次找到区间最高值把询问分成两半
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=1e5+100;const int INF=1e9;#define ll o<<1#define rr o<<1|1#define mid (l+r)/2struct Node { int h,l,r; bool operator<(const Node & th)const { return h!=th.h?h<th.h:r<th.r; }}node[N];int clo[N*8],mx[N*8];void up(int x,int &y){ if(y==-1){ y=x;return ; } if(x==-1)return ; if(node[x].h>node[y].h)y=x; if(node[x].h==node[y].h&&node[x].r>node[y].r)y=x;}void pushdown(int l,int r,int o){ if(clo[o]!=-1){ clo[ll]=clo[rr]=clo[o]; mx[ll]=mx[rr]=mx[o]; clo[o]=-1; }}void pushup(int l,int r,int o){ mx[o]=mx[ll]; up(mx[rr],mx[o]);}int L,R,V;void update(int l,int r,int o){ if(L<=l&&r<=R){ clo[o]=V; mx[o]=V; return ; } pushdown(l,r,o); if(L<=mid)update(l,mid,ll); if(R>mid)update(mid+1,r,rr); pushup(l,r,o);}void query(int l,int r,int o){ if(L<=l&&r<=R){ int x=mx[o]; up(x,V); return ; } pushdown(l,r,o); if(L<=mid)query(l,mid,ll); if(R>mid)query(mid+1,r,rr);}int sta[2*N],top,dp[N];int dfs(int l,int r,int mask){ L=l,R=r,V=-1; query(0,top-1,1); if(V==-1)return -1; int x=max(l,node[V].l),y=min(r,node[V].r); int ans=0; if((mask&2)&&node[V].l<l||(mask&1)&&node[V].r>r); else { ans=min(dp[V],sta[y]-sta[x]+1); } if(y<r)ans=max(ans,dfs(y+1,r,mask|2)); if(x>l)ans=max(ans,dfs(l,x-1,mask|1)); //printf("%d %d %d\n",l,r,ans); return ans;}int main(){ #ifdef DouBi freopen("in.cpp","r",stdin); #endif // DouBi int n,t; while(scanf("%d%d",&n,&t)!=EOF){ top=0; for(int i=0;i<n;i++){ scanf("%d%d%d",&node[i].h,&node[i].l,&node[i].r);node[i].r--; sta[top++]=node[i].l,sta[top++]=node[i].r; } node[n].h=0;node[n].l=-INF;node[n].r=INF; node[n+1].h=t;node[n+1].l=-INF;node[n+1].r=INF; sta[top++]=-INF;sta[top++]=INF; n+=2; sort(sta,sta+top);top=unique(sta,sta+top)-sta; for(int i=0;i<n;i++){ node[i].l=lower_bound(sta,sta+top,node[i].l)-sta; node[i].r=lower_bound(sta,sta+top,node[i].r)-sta; } sort(node,node+n); memset(mx,-1,sizeof(mx)); memset(clo,-1,sizeof(clo)); L=node[0].l,R=node[0].r,V=0; update(0,top-1,1);dp[0]=2*INF; for(int i=1;i<n;i++){ int j=i; while(j+1<n&&node[j+1].h==node[i].h)j++; for(int k=i;k<=j;k++){ //printf("%d.........\n",k); dp[k]=dfs(node[k].l,node[k].r,0); } for(int k=i;k<=j;k++){ L=node[k].l,R=node[k].r,V=k; update(0,top-1,1); } i=j; } //for(int i=0;i<n;i++)printf("%dh %dl %dr:%did %ddp\n",node[i].h,node[i].l,node[i].r,i,dp[i]); printf("%d\n",dp[n-1]); } return 0;}
0 0
- CodeForces 269D
- Codeforces Round #269 (Div. 2) D
- Codeforces Round #269 (Div. 2) A~D
- codeforces Round #269(div2) D解题报告
- Codeforces Round #269 (Div. 2) D kmp
- CodeForces 617D CodeForces 617D
- CodeForces 101D
- CodeForces 103D
- CodeForces 222D Olympiad
- codeforces 242d
- CodeForces 111D
- 【codeforces】3D
- CodeForces 127D Password
- codeforces 257D. Sum
- Codeforces 292D
- Codeforces 275D
- Codeforces 126D
- Codeforces 337d
- C# WinForm DataGridView 分页程序
- Struts2框架xml验证
- 读取 Excel(POI) 转 HTML
- github初使用
- android Retrofit+OkHttp使用自制的证书实现https安全传输
- CodeForces 269D
- JDK1.5新特性5-增强for循环
- Spring的点点滴滴之动态代理
- Docker网络管理
- Android笔记:仿系统图片库(GridView的多选删除)实用篇
- 微软发布Visual Studio Mac预览版
- Leetcode 453 Minimum Moves to Equal Array Elements
- IE兼容性问题(二)
- emWin 2天速成实例教程009_ListView列表框控件使用方法