HDU 1540 POJ 2892 Tunnel Warfare

#include <iostream>
#include
<algorithm>
#include
<stack>
#define L(x) ((x) << 1)
#define R(x) ((x) << 1 | 1)
using namespace std;
const int MAXN = 50000;
struct SegTree{
int l, r;
int mval, lval, rval;
int cover; //1 没坏 0 坏 -1 有的坏了 有的没坏
void init(int c){
lval
= rval = mval = (c == 1 ? ( r - l + 1 ) : 0);
cover
= c;
}
int getMid(){
return ( l + r ) >> 1;
}
int getDis(){
return ( r - l + 1);
}
}tree[MAXN
<< 2];

void bulid(int left, int right, int t){
tree[t].l
= left;
tree[t].r
= right;
tree[t].init(
1);
if( left == right )
return;
int mid = tree[t].getMid();
bulid(left, mid, L(t));
bulid(mid
+ 1, right, R(t));
}

void update(int x, int c, int t){
if(tree[t].l == tree[t].r && tree[t].l == x){
tree[t].init(c);
return;
}
if( tree[t].cover != -1 ){
tree[L(t)].cover
= tree[R(t)].cover = tree[t].cover;
tree[L(t)].init(tree[t].cover);
tree[R(t)].init(tree[t].cover);
}
int mid = tree[t].getMid();
if( x <= mid ){
update(x, c, L(t));
}
else {
update(x, c, R(t));
}

tree[t].mval
= max(tree[L(t)].rval + tree[R(t)].lval, max(tree[L(t)].mval, tree[R(t)].mval));
tree[t].lval
= tree[L(t)].lval + (tree[L(t)].cover == 1 ? tree[R(t)].lval : 0);
tree[t].rval
= tree[R(t)].rval + (tree[R(t)].cover == 1 ? tree[L(t)].rval : 0);
if( tree[L(t)].cover == tree[R(t)].cover && tree[L(t)].cover != -1){ //此处无限wa 还一直找区间的问题 纠结 考虑一种情况 如果左右孩子的cover 都为-1 此时把父亲的cover也置为-1了 而我是用init 初始化 -1 传进去 则变成 0 整个区间置为空了!!!!!!!
tree[t].init(tree[R(t)].cover); //!!!!!!!!!!!!!!!!!!!!!!!!!
} else {
tree[t].cover
= -1;
}
}
int query(int x, int t){
if( tree[t].cover == 1 )
return tree[t].mval;
if( tree[t]. cover == 0 )
return 0;
int mid = tree[t].getMid();
if( x <= mid ){
if( mid - x + 1 <= tree[L(t)].rval)
return tree[L(t)].rval + tree[R(t)].lval;
return query(x, L(t));
}
else {
if( mid + tree[R(t)].lval >= x)
return tree[R(t)].lval + tree[L(t)].rval;
return query(x, R(t));
}

}
int main(){
int n, m, x, last;
char cmd[3];
while( cin >> n >> m){
bulid(
1, n, 1);
stack
<int> st;
for(int i = 0; i < m; ++i){
cin
>> cmd ;
if( cmd[0] == 'D'){
cin
>> x;
st.push(x);
update(x,
0, 1);
}
else if(cmd[0] == 'Q'){
cin
>> x;
cout
<< query(x, 1) << endl;
}
else if(cmd[0] == 'R'){
if(st.empty())
continue;
last
= st.top();
st.pop();
update(last,
1, 1);
}
}
}
return 0;
}
posted @ 2011-04-10 05:37  L..  阅读(377)  评论(0编辑  收藏  举报