cf C. Knight Tournament

http://codeforces.com/contest/357/problem/C

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #define maxn 300010
  5 using namespace std;
  6 
  7 int n,m;
  8 int l1,r1,x1;
  9 struct node
 10 {
 11     int l,r;
 12     int cover;
 13 }tree[maxn*4];
 14 int x[maxn];
 15 
 16 void build(int i,int l,int r)
 17 {
 18     tree[i].l=l;tree[i].r=r;
 19     tree[i].cover=0;
 20     if(l==r) return ;
 21     int mid=(l+r)>>1;
 22     build(i<<1,l,mid);
 23     build(i<<1|1,mid+1,r);
 24 }
 25 void down(int i)
 26 {
 27     if(tree[i].l==tree[i].r) return ;
 28     if(tree[i].cover>0)
 29     {
 30         if(tree[i<<1].cover==0)
 31             tree[i<<1].cover=tree[i].cover;
 32         if(tree[i<<1|1].cover==0)
 33             tree[i<<1|1].cover=tree[i].cover;
 34         tree[i].cover=-1;
 35     }
 36 }
 37 void update(int i,int l,int r,int co)
 38 {
 39     if(tree[i].l==l&&tree[i].r==r)
 40     {
 41         if(tree[i].cover==0)
 42         {
 43             tree[i].cover=co;
 44         }
 45         return ;
 46     }
 47     down(i);
 48     int mid=(tree[i].l+tree[i].r)>>1;
 49     if(r<=mid)
 50     {
 51         update(i<<1,l,r,co);
 52     }
 53     else if(l>mid)
 54     {
 55         update(i<<1|1,l,r,co);
 56     }
 57     else
 58     {
 59         update(i<<1,l,mid,co);
 60         update(i<<1|1,mid+1,r,co);
 61     }
 62 }
 63 
 64 void search1(int i)
 65 {
 66     if(tree[i].l==tree[i].r)
 67     {
 68         x[tree[i].l]=tree[i].cover;
 69         return;
 70     }
 71     down(i);
 72     search1(i<<1);
 73     search1(i<<1|1);
 74 }
 75 
 76 int main()
 77 {
 78     while(scanf("%d%d",&n,&m)!=EOF)
 79     {
 80         build(1,1,n);
 81         memset(x,0,sizeof(x));
 82         for(int i=1; i<=m; i++)
 83         {
 84             scanf("%d%d%d",&l1,&r1,&x1);
 85             if(l1==x1){
 86             update(1,l1+1,r1,x1);
 87             }
 88             else if(r1==x1)
 89             {
 90                 update(1,l1,r1-1,x1);
 91             }
 92             else
 93             {
 94                 update(1,l1,x1-1,x1);
 95                 update(1,x1+1,r1,x1);
 96             }
 97         }
 98         search1(1);
 99         for(int i=1; i<=n; i++)
100         {
101             if(i==1)
102             printf("%d",x[i]);
103             else
104                 printf(" %d",x[i]);
105         }
106         printf("
");
107     }
108     return 0;
109 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/3935030.html