线段树专辑——hdu 1540 Tunnel Warfare

http://acm.hdu.edu.cn/showproblem.php?pid=1540

又是一道跟新查找最大了连续空余区间的题目,由于每次都是炸一个点和修复一个点,所以max_val域都省下了~

由于题目只要求数目,无涉及节点的先后,所以查找的话随便怎么查吧,只要你别遗漏就好了

还有一个要注意的就是一个隧道是可以重复炸毁重复修复的~~

View Code
  1 #include<iostream>
2 #include<string>
3 #include<stack>
4 #include<algorithm>
5 using namespace std;
6
7 struct node
8 {
9 int l;
10 int r;
11 int l_val;
12 int r_val;
13 int cover;
14 };
15
16 node tree[250000];
17
18 int max(int a,int b)
19 {
20 return a>b?a:b;
21 }
22
23 stack<int>S;
24 int n,m;
25
26 void build(int i,int l,int r)
27 {
28 tree[i].l=l;
29 tree[i].r=r;
30 tree[i].cover=0;
31 tree[i].l_val=tree[i].r_val=r-l+1;
32 if(l==r)
33 return;
34 int mid=(l+r)/2;
35 build(2*i,l,mid);
36 build(2*i+1,mid+1,r);
37 }
38
39 void fun(int i)
40 {
41 if(tree[i].cover==0)
42 {
43 tree[i].l_val=tree[i].r_val=tree[i].r-tree[i].l+1;
44 }
45 else
46 {
47 tree[i].l_val=tree[i].r_val=0;
48 }
49 }
50
51 void updata(int i,int l,int r,int w)
52 {
53 if(tree[i].l>r || tree[i].r<l)
54 return;
55 if(tree[i].l>=l && tree[i].r<=r)
56 {
57 tree[i].cover=w;
58 fun(i);
59 return;
60 }
61 if(tree[i].cover!=-1)
62 {
63 tree[2*i].cover=tree[2*i+1].cover=tree[i].cover;
64 fun(2*i);
65 fun(2*i+1);
66 tree[i].cover=-1;
67 }
68 updata(2*i,l,r,w);
69 updata(2*i+1,l,r,w);
70 if(tree[2*i].cover==tree[2*i+1].cover)
71 tree[i].cover=tree[2*i].cover;
72 else
73 tree[i].cover=-1;
74 tree[i].l_val=tree[2*i].l_val+(tree[2*i].cover==0?tree[2*i+1].l_val:0);
75 tree[i].r_val=tree[2*i+1].r_val+(tree[2*i+1].cover==0?tree[2*i].r_val:0);
76 }
77
78 int query(int i,int w)
79 {
80 if(tree[i].l<=w && tree[i].l+tree[i].l_val-1>=w) //w点在左边
81 return tree[i].l_val;
82 else if(tree[i].r>=w && tree[i].r-tree[i].r_val+1<=w) //w点在右边
83 return tree[i].r_val;
84 else if(tree[2*i].r-tree[2*i].r_val+1<=w && tree[2*i+1].l+tree[2*i+1].l_val-1>=w) //w点在中间的连续空闲空间
85 return tree[2*i].r_val+tree[2*i+1].l_val;
86 else if(tree[i].l<tree[i].r) //没找到,则向左右子区间查找
87 {
88 int mid=(tree[i].l+tree[i].r)/2;
89 if(w<=mid)
90 {
91 return query(2*i,w);
92 }
93 else if(w>mid)
94 {
95 return query(2*i+1,w);
96 }
97 }
98 return 0;
99 }
100
101 int main()
102 {
103 char c;
104 int i,a;
105 freopen("in.txt","r",stdin);
106 while(scanf("%d%d",&n,&m)==2)
107 {
108 build(1,1,n);
109 while(!S.empty())
110 S.pop();
111 for(i=0;i<m;i++)
112 {
113 getchar();
114 scanf("%c",&c);
115 if(c=='D')
116 {
117 scanf("%d",&a);
118 S.push(a);
119 updata(1,a,a,1);
120 }
121 else if(c=='R')
122 {
123 a=S.top();
124 S.pop();
125 updata(1,a,a,0);
126 }
127 else
128 {
129 scanf("%d",&a);
130 a=query(1,a);
131 printf("%d\n",a);
132 }
133 }
134 }
135 return 0;
136 }

 

posted @ 2011-11-11 16:46  Accept  阅读(283)  评论(0编辑  收藏  举报