这两天在搞基础的图论。。。一直没去搞这个,今天一搞原来这么简单,怪不得别人说线段树模板题,只不过函数多了点,成段更新,单点询问,懒惰标记。
#include <stdio.h> #include <string.h> #define lson rt<<1, l, mid #define rson rt<<1|1, mid+1, r const int maxn = 50005; struct PP{ int sum, flag; }node[maxn<<2]; void create(int rt, int l, int r) { node[rt].sum = r-l+1; node[rt].flag = 0; if(l == r) return ; int mid = (l+r)/2; create(lson);create(rson); } void push_up(int rt) { node[rt].sum = node[rt<<1].sum + node[rt<<1|1].sum; } void push_down(int rt, int l, int r) { int mid = (l+r)/2; if(node[rt].flag == 1) { node[rt<<1].flag = node[rt<<1|1].flag = 1; node[rt<<1].sum = mid-l+1; node[rt<<1|1].sum = r-mid; node[rt].flag = 0; } else if(node[rt].flag == 2) { node[rt<<1].flag = node[rt<<1|1].flag = 2; node[rt<<1].sum = node[rt<<1|1].sum = 0; node[rt].flag = 0; } } int get_sum(int rt, int l, int r, int x) { if(l == x) { return node[rt].sum; } push_down(rt, l, r); int mid = (l+r)/2; if(x <= mid) return get_sum(lson, x) + node[rt<<1|1].sum; if(x > mid) return get_sum(rson, x); push_up(rt); } int get_pos(int rt, int l, int r, int num) { if(l == r) return l; push_down(rt, l, r); int mid = (l+r)/2; int lsum = node[rt<<1].sum; if(lsum >= num) return get_pos(lson, num); return get_pos(rson, num-lsum); push_up(rt); } void update1(int rt, int l, int r, int L, int R) { if(L <= l && R >= r) { node[rt].flag = 2; node[rt].sum = 0; return ; } push_down(rt, l, r); int mid = (l+r)/2; if(L <= mid) update1(lson, L, R); if(R > mid) update1(rson, L, R); push_up(rt); } int update2(int rt, int l, int r, int L, int R) { if(L <= l && R >= r) { node[rt].flag = 1; int ret = r-l+1-node[rt].sum; node[rt].sum = r-l+1; return ret; } push_down(rt, l, r); int mid = (l+r)/2; int ans1 = 0, ans2 = 0; if(L <= mid) ans1 = update2(lson, L, R); if(R > mid) ans2 = update2(rson, L, R); push_up(rt); return ans1 + ans2; } int main() { int t, n, m, x, l, r; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); create(1, 1, n); while(m--) { scanf("%d%d%d", &x, &l ,&r); if(x == 1) { l++; int cur = get_sum(1, 1, n, l); if(cur == 0) { puts("Can not put any one."); continue; } int ll = (node[1].sum-cur); int ans1 = get_pos(1, 1, n, ll+1); if(cur > r) cur = r; int ans2 = get_pos(1, 1, n, ll+cur); printf("%d %d\n", ans1-1, ans2-1); update1(1, 1, n, ans1, ans2); } else { l++, r++; int ans = update2(1, 1, n, l, r); printf("%d\n", ans); } } puts(""); } return 0; }