zoj 3888 线段树 ***

卡n^2,用线段树降到nlogn

记录每个点上所覆盖线段的次小值,保证能有两条路径能走

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 #define MOD 1000000007
 10 const int INF=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 #define lson l,mid,rt<<1
 13 #define rson mid+1,r,rt<<1|1
 14 #define root 1,n,1
 15 #define mid ((l+r)>>1)
 16 typedef long long ll;
 17 #define cl(a) memset(a,0,sizeof(a))
 18 #define ts printf("*****
");
 19 const int N=51005;
 20 int n,m,tt;
 21 int a[N<<4],b[N<<4];
 22 void pushdown(int rt)
 23 {
 24     //printf("pd:%d %d %d
",a[rt],b[rt],rt);
 25     if(b[rt]!=9999999)
 26     {
 27         if(b[rt]>=a[rt<<1]&&b[rt]<b[rt<<1])
 28         {
 29             b[rt<<1]=b[rt];
 30         }
 31         if(b[rt]<a[rt<<1])
 32         {
 33             a[rt<<1]=b[rt<<1];
 34             a[rt<<1]=b[rt];
 35         }
 36         if(b[rt]>=a[rt<<1|1]&&b[rt]<b[rt<<1|1])
 37         {
 38             b[rt<<1|1]=b[rt];
 39         }
 40         if(b[rt]<a[rt<<1|1])
 41         {
 42             b[rt<<1|1]=a[rt<<1|1];
 43             a[rt<<1|1]=b[rt];
 44         }
 45         b[rt]=9999999;
 46     }
 47     /*if(rt==4)
 48     {
 49         printf("%d %d
",a[rt<<1],b[rt<<1]);
 50     }*/
 51     if(a[rt]!=9999999)
 52     {
 53         if(a[rt]>=a[rt<<1]&&a[rt]<b[rt<<1])
 54         {
 55             b[rt<<1]=a[rt];
 56         }
 57         if(a[rt]<a[rt<<1])
 58         {
 59             b[rt<<1]=a[rt<<1];
 60             a[rt<<1]=a[rt];
 61         }
 62         if(a[rt]>=a[rt<<1|1]&&a[rt]<b[rt<<1|1])
 63         {
 64             b[rt<<1|1]=a[rt];
 65         }
 66         if(a[rt]<a[rt<<1|1])
 67         {
 68             b[rt<<1|1]=a[rt<<1|1];
 69             a[rt<<1|1]=a[rt];
 70         }
 71         a[rt]=9999999;
 72     }
 73     //printf("%d %d ++%d++
",a[rt<<1],b[rt<<1],rt<<1);
 74 }
 75 void build(int l,int r,int rt)
 76 {
 77     a[rt]=b[rt]=9999999;
 78     if(l==r)
 79     {
 80         a[rt]=b[rt]=l;
 81         return;
 82     }
 83     build(lson);
 84     build(rson);
 85 }
 86 void update(int L,int R,int val,int l,int r,int rt)
 87 {
 88     if(l>=L&&r<=R)
 89     {
 90         int x=val;
 91         if(b[rt]>x&&x>a[rt])
 92         {
 93             b[rt]=x;
 94         }
 95         if(x<b[rt])
 96         {
 97             b[rt]=a[rt];
 98             a[rt]=x;
 99         }
100         return;
101     }
102     pushdown(rt);
103     if(L<=mid)  update(L,R,val,lson);
104     if(R>mid)  update(L,R,val,rson);
105 }
106 int query(int pos,int l,int r,int rt)
107 {
108     //printf("%d %d %d %d %d
",a[rt],b[rt],l,r,rt);
109     if(l==r)
110     {
111         return b[rt];
112     }
113     pushdown(rt);
114     if(pos<=mid)  return query(pos,lson);
115     else return query(pos,rson);
116 }
117 int main()
118 {
119     int i,j,k,ca=1,q;
120     #ifndef ONLINE_JUDGE
121     freopen("1.in","r",stdin);
122     #endif
123     while(scanf("%d%d%d",&n,&m,&q)!=EOF)
124     {
125         int x,y;
126         build(root);
127         for(i=0;i<m;i++)
128         {
129             scanf("%d%d",&y,&x);
130             update(x,y,x,root);    //记录次小x
131         }
132         while(q--)
133         {
134             scanf("%d",&x);
135             printf("%d
",x-query(x,root));
136         }
137     }
138 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4737365.html