Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

用线段树TLE的同学进来看看..

Posted by damacheng009 at 2010-10-06 15:12:15 on Problem 2155 and last updated at 2010-10-06 15:14:13
不要记录每个结点的change的次数,这样必TLE。
记录每个结点表示的矩形的状态即可。
query的时候如果要查找的点被当前矩形覆盖则 res ^= 当前矩形的状态。

参考代码如下:
#include <cstdio>

struct sub_node {
    short seg_left;
    short seg_right;
    bool value;
};

struct seg_node {
    short seg_left;
    short seg_right;
    sub_node sub_nodes[2100];
};

seg_node seg_nodes[2100];
int range, op_num, res;

void build_sub(short p_slot, short slot, short left, short right) {
    sub_node *p_cur_node = &seg_nodes[p_slot].sub_nodes[slot];
    p_cur_node->seg_left = left;
    p_cur_node->seg_right = right;
    p_cur_node->value = false;

    if(left == right) {
        return;
    }

    short mid = (left + right) >> 1;
    build_sub(p_slot, slot * 2, left, mid);
    build_sub(p_slot, slot * 2 + 1, mid + 1, right);
}

void build(short slot, short left, short right) {
    seg_nodes[slot].seg_left = left;
    seg_nodes[slot].seg_right = right;
    build_sub(slot, 1, 1, range);

    if(left == right) {
        return;
    }

    short mid = (left + right) >> 1;
    build(slot * 2, left, mid);
    build(slot * 2 + 1, mid + 1, right);
}

void change_sub(short p_slot, short slot, short left, short right) {
    sub_node *p_cur_node = &seg_nodes[p_slot].sub_nodes[slot];

    if(p_cur_node->seg_left == left && p_cur_node->seg_right == right) {
        p_cur_node->value = !p_cur_node->value;
        return;
    }

    short mid = (p_cur_node->seg_left + p_cur_node->seg_right) >> 1;
    if(right <= mid) {
        change_sub(p_slot, slot * 2, left, right);
    } else if(left >= mid + 1) {
        change_sub(p_slot, slot * 2 + 1, left, right);
    } else {
        change_sub(p_slot, slot * 2, left, mid);
        change_sub(p_slot, slot * 2 + 1, mid + 1, right);
    }
}

void change(short slot, short left, short right, short sub_left, short sub_right) {
    if(seg_nodes[slot].seg_left == left && seg_nodes[slot].seg_right == right) {
        change_sub(slot, 1, sub_left, sub_right);
        return;
    }

    short mid = (seg_nodes[slot].seg_left + seg_nodes[slot].seg_right) >> 1;
    if(right <= mid) {
        change(slot * 2, left, right, sub_left, sub_right);
    } else if(left >= mid + 1) {
        change(slot * 2 + 1, left, right, sub_left, sub_right);
    } else {
        change(slot * 2, left, mid, sub_left, sub_right);
        change(slot * 2 + 1, mid + 1, right, sub_left, sub_right);
    }
}

void query_sub(short p_slot, short slot, short y) {
    sub_node *p_cur_node = &seg_nodes[p_slot].sub_nodes[slot];
    res ^= p_cur_node->value;

    if(p_cur_node->seg_left == p_cur_node->seg_right) {
        return;
    }

    short mid = (p_cur_node->seg_left + p_cur_node->seg_right) >> 1;
    if(y <= mid) {
        query_sub(p_slot, slot * 2, y);
    } else {
        query_sub(p_slot, slot * 2 + 1, y);
    }
}

void query(short slot, short x, short y) {
    query_sub(slot, 1, y);

    if(seg_nodes[slot].seg_left == seg_nodes[slot].seg_right) {
        return;
    }

    short mid = (seg_nodes[slot].seg_left + seg_nodes[slot].seg_right) >> 1;
    if(x <= mid) {
        query(slot * 2, x, y);
    } else {
        query(slot * 2 + 1, x, y);
    }
}

int main() {
    //freopen("e:/data.txt", "r", stdin);
    int cases;
    scanf("%d", &cases);

    for(int c = 0; c < cases; ++c) {
        scanf("%d %d", &range, &op_num);
        build(1, 1, range);

        char op[2];
        int x1, y1, x2, y2;
        for(int i = 0; i < op_num; ++i) {
            scanf("%s", op);
            if(op[0] == 'Q') {
                scanf("%d %d", &x1, &y1);
                res = 0;
                query(1, x1, y1);
                printf("%d\n", res);
            } else if(op[0] == 'C') {
                scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
                change(1, x1, x2, y1, y2);
            }
        }

        putchar('\n');
    }
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator