结构体中定义记录染色次数的参数(cov),更新时直接找到对应的区间,使cov++。查询时要有点小操作。
查询过程:
void query(当前节点 t,要查询的点 x) { if(找到要查询的点) return cov; if(该点的cov > 0) { 左孩子.cov += 当前节点.cov; 右孩子.cov += 当前节点.cov; 当前节点.cov = 0; } mid = (左孩子+右孩子) >> 1; if(x <= mid) query(左孩子, x); else query(右孩子, x); }
下边是完整的代码:
View Code
#include#define N 100010 struct node { int l, r; int cov; }node[N*4]; int ans; void creat(int t, int l, int r) { node[t].l = l; node[t].r = r; node[t].cov = 0; if(l == r) return; int mid = (node[t].l + node[t].r) >> 1; creat(t<<1, l, mid); creat(t<<1|1, mid+1, r); } void updata(int t, int l, int r) { if(node[t].l >= l && node[t].r <= r) { node[t].cov++; return; } int mid = (node[t].l + node[t].r) >> 1; if(l > mid) updata(t<<1|1, l, r); else if(r <= mid) updata(t<<1, l, r); else { updata(t<<1, l, mid); updata(t<<1|1, mid+1, r); } } void query(int t, int x) { if(node[t].l == node[t].r) { ans = node[t].cov; return; } if(node[t].cov > 0) { node[t<<1].cov += node[t].cov; node[t<<1|1].cov += node[t].cov; node[t].cov = 0; } int mid = (node[t].l + node[t].r) >> 1; if(x <= mid) query(t<<1, x); else query(t<<1|1, x); } int main() { int n, i, x, y; //freopen("data.in", "r", stdin); while(scanf("%d", &n), n) { creat(1, 1, n); for(i = 1; i <= n; i++) { scanf("%d%d", &x, &y); updata(1, x, y); } for(i = 1; i < n; i++) { query(1, i); printf("%d ", ans);//printf("ok\n"); } query(1, n); printf("%d\n", ans); } return 0; }