码迷,mamicode.com
首页 > 其他好文 > 详细

zoj1610 线段树

时间:2014-09-25 22:14:17      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   sp   

bubuko.com,布布扣
  1 //Accepted    804 KB    40 ms
  2 //整个题,都是坑
  3 //1.The first line of each data set contains exactly one integer n,
  4 //1 <= n <= 8000, equal to the number of colored segments
  5 //意思是:n表示染色线段的条数,而不是区间的总长度
  6 //2.x1 and x2 indicate the left endpoint and right endpoint of the segment, c indicates the color of the segment.
  7 //x1 ,x2 表示染色区间的端点位置,而染色的是区间
  8 #include <cstdio>
  9 #include <cstring>
 10 #include <iostream>
 11 #include <queue>
 12 #include <cmath>
 13 #include <algorithm>
 14 using namespace std;
 15 /**
 16   * This is a documentation comment block
 17   * 如果有一天你坚持不下去了,就想想你为什么走到这儿!
 18   * @authr songt
 19   */
 20 const int imax_n = 8005;
 21 int color[imax_n];
 22 struct node
 23 {
 24     int l,r;
 25     int c;
 26     int change;
 27 }f[imax_n*4];
 28 void build(int t,int l,int r)
 29 {
 30     f[t].l=l;
 31     f[t].r=r;
 32     f[t].c=0;
 33     f[t].change=0;
 34     if (l==r)
 35     {
 36         return ;
 37     }
 38     int mid=(f[t].l+f[t].r)/2;
 39     build(2*t,l,mid);
 40     build(2*t+1,mid+1,r);
 41 }
 42 void update(int t,int l,int r,int c)
 43 {
 44     if (f[t].l==l && f[t].r==r)
 45     {
 46         f[t].c=c;
 47         f[t].change=1;
 48         return ;
 49     }
 50     if (f[t].change!=0)
 51     {
 52         f[2*t].c=f[t].c;
 53         f[2*t+1].c=f[t].c;
 54         f[2*t].change=f[2*t+1].change=1;
 55         f[t].change=0;
 56     }
 57     int mid=(f[t].l+f[t].r)/2;
 58     if (r<=mid) update(2*t,l,r,c);
 59     else
 60     {
 61         if (l>mid) update(2*t+1,l,r,c);
 62         else
 63         {
 64             update(2*t,l,mid,c);
 65             update(2*t+1,mid+1,r,c);
 66         }
 67     }
 68 }
 69 int query(int t,int k)
 70 {
 71     if (!(f[t].l<=k && f[t].r>=k)) return 0;
 72     if (f[t].l==f[t].r && f[t].l==k)
 73     {
 74         return f[t].c;
 75     }
 76     if (f[t].change!=0)
 77     {
 78         return f[t].c;
 79     }
 80     int mid=(f[t].l+f[t].r)/2;
 81     if (k<=mid) return query(2*t,k);
 82     else return query(2*t+1,k);
 83 }
 84 int n;
 85 int x,y,c;
 86 void slove()
 87 {
 88     build(1,1,8000);
 89     for (int i=1;i<=n;i++)
 90     {
 91         scanf("%d%d%d",&x,&y,&c);
 92         x++;
 93         c++;
 94         if (x>y) continue ;
 95         update(1,x,y,c);
 96     }
 97     int t1,t2;
 98     t1=0;
 99     memset(color,0,sizeof(color));
100     for (int i=1;i<=8000;i++)
101     {
102         t2=query(1,i);
103         if (t2==0)
104         {
105             t1=t2;
106             continue ;
107         }
108         if (t2==t1) continue;
109         color[t2]++;
110         t1=t2;
111     }
112     for (int i=1;i<=8001;i++)
113     if (color[i]!=0)
114     {
115         printf("%d %d\n",i-1,color[i]);
116     }
117 }
118 int main()
119 {
120     while (scanf("%d",&n)!=EOF)
121     {
122         slove();
123         printf("\n");
124     }
125     return 0;
126 }
View Code

 

zoj1610 线段树

标签:style   blog   http   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/djingjing/p/3993556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!