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
原创粉丝点击