HDU 1540 Tunnel Warfare——特殊查询的线段树

来源:互联网 发布:腾讯足球数据统计 编辑:程序博客网 时间:2024/06/03 23:43

一定要注意查询范围,以及及时变动查询位置,具体参考代码query函数

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <stack>using namespace std;const int maxn = 1e5;stack<int> last;int n, q;struct SegTree {    bool is_all0;    int maxL, maxR, max0;}segTree[maxn<<2];void pushup(int root) {    segTree[root].is_all0 = segTree[root<<1].is_all0 && segTree[root<<1|1].is_all0;    segTree[root].maxL = segTree[root<<1].maxL + (segTree[root<<1].is_all0 ? segTree[root<<1|1].maxL : 0);    segTree[root].maxR = segTree[root<<1|1].maxR + (segTree[root<<1|1].is_all0 ? segTree[root<<1].maxR : 0);    segTree[root].max0 = max(segTree[root<<1].maxR + segTree[root<<1|1].maxL, max(segTree[root<<1].max0, segTree[root<<1|1].max0));}void build(int L, int R, int root) {    if (L == R) {        segTree[root].is_all0 = true;        segTree[root].maxL = segTree[root].maxR = segTree[root].max0 = 1;        return;    }    int mid = (L + R)>>1;    build(L, mid, root<<1);    build(mid + 1, R, root<<1|1);    pushup(root);}void update_node(int L, int R, int root, int pos, int val) {    if (L == R) {        segTree[root].is_all0 = val;        segTree[root].maxL = segTree[root].maxR = segTree[root].max0 = val;        return;    }    int mid = (L + R)>>1;    if (pos <= mid) {        update_node(L, mid, root<<1, pos, val);    }    else {        update_node(mid + 1, R, root<<1|1, pos, val);    }    pushup(root);}int query(int L, int R, int root, int pos) {    if (L == R || segTree[root].max0 == 0 || segTree[root].max0 == R - L + 1) {        return segTree[root].max0;    }    int mid = (L + R)>>1;    if (pos <= mid) {        if (pos >= mid - segTree[root<<1].maxR + 1) {            return query(L, mid, root<<1, pos) + query(mid + 1, R, root<<1|1, mid + 1);        }        else {            return query(L, mid, root<<1, pos);        }    }    else {        if (pos <= mid + segTree[root<<1|1].maxL) {            return query(mid + 1, R, root<<1|1, pos) + query(L, mid, root<<1, mid);        }        else {            return query(mid + 1, R, root<<1|1, pos);        }    }}int main(){    while (scanf("%d %d", &n, &q) == 2) {        build(1, n, 1);        while (!last.empty()) last.pop();        while (q--) {            char c; cin >> c;            if (c == 'D') {                int x; scanf("%d", &x);                last.push(x);                update_node(1, n, 1, x, 0);            }            else if (c == 'R') {                int x = last.top(); last.pop();                update_node(1, n, 1, x, 1);            }            else {                int x; scanf("%d", &x);                printf("%d\n", query(1, n, 1, x));            }        }    }    return 0;}


原创粉丝点击