您的位置:首页 > 其它

HDU 1540 POJ 2892 Tunnel Warfare

2011-04-10 05:37 423 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: