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

vijos p1881 线段树

时间:2015-05-15 06:35:30      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

题意:点我

我就想问,现在换代码风格还来得及吗?

 1 #include<cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define mid (l+r)/2
 5 #define ls rt<<1,l,mid
 6 #define rs rt<<1|1,mid+1,r
 7 using namespace std;
 8 const int Rn=199999+9;
 9 int N,Q;
10 struct Node
11 {
12     int lc,rc;  //左右两端颜色
13     int ln,rn;  //左右两边长度
14     int val;    //长度
15 }T[Rn<<2];
16 void pushup(int rt,int l,int r)
17 {
18     Node &x1=T[rt],x2=T[rt<<1],x3=T[rt<<1 | 1];
19     x1.lc=x2.lc;
20     x1.rc=x3.rc;
21     x1.ln=x2.ln;
22     x1.rn=x3.rn;
23     x1.val=max(x2.val,x3.val);
24     if(x2.rc!=x3.lc)
25     {
26         x1.val=max(x1.val,x2.rn+x3.ln);
27         if(x2.val==mid-l+1){
28             x1.ln=x2.val+x3.ln;
29         }
30         if(x3.val==r-mid){
31             x1.rn=x3.val+x2.rn;
32         }
33     }
34 
35 }
36 void build(int rt,int l,int r)
37 {
38     Node &S=T[rt];
39     S.lc=S.rc=S.ln=S.rn=S.val=1;
40     if(l==r)
41     {
42         return;
43     }
44     build(ls);
45     build(rs);
46 }
47 
48 void update(int rt,int l,int r,int x)
49 {
50     if(l==r)
51     {
52         T[rt].lc=T[rt].rc=T[rt].lc^1;
53         return;
54     }
55     if(x<=mid)
56     {
57         update(ls,x);
58     }
59     if(x>mid)
60     {
61         update(rs,x);
62     }
63     pushup(rt,l,r);
64 }
65 
66 int main()
67 {
68     #ifndef ONLINE_JUDGE
69     freopen("1.in","r",stdin);
70     #endif
71     int x;
72     scanf("%d%d",&N,&Q);
73     build(1,1,N);
74     for(int i=0;i<Q;i++)
75     {
76         scanf("%d",&x);
77         update(1,1,N,x);
78         printf("%d\n",T[1].val);
79     }
80     return 0;
81 
82 }

 

vijos p1881 线段树

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4504874.html

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