ACM- Color the ball

    xiaoxiao2021-04-14  79

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗? Input 每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。 当N = 0,输入结束。 Output 每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。 Sample Input 3 1 1 2 2 3 3 3 1 1 1 2 1 3 0 Sample Output

    1 1 13 2 1

    #include <iostream> #include <stdio.h> #include<string.h> using namespace std; struct node { int l, r, mark; }a[500000]; int k, n; void set(int l,int r,int i) { a[i].l = l; a[i].r = r; a[i].mark = 0; if (l == r) { return; } int mid = (l + r) / 2; set(l, mid, i * 2); set(mid + 1, r, i * 2 + 1); } void move(int i) { a[2 * i].mark += a[i].mark; a[i * 2 + 1].mark += a[i].mark;//要向下加,直接覆盖会错 a[i].mark = 0; } void add(int l, int r, int i) { if (a[i].r == a[i].l) { a[i].mark += 1; return; } if (a[i].r == r&&a[i].l==l) { a[i].mark += 1; return; } if (a[i].mark)move(i);//下移 int mid = (a[i].r + a[i].l) / 2; if (mid >= r)add(l, r, i * 2); else if (mid < l)add(l, r, i * 2 + 1); else add(l, mid, i * 2), add(mid + 1, r, i * 2 + 1); } void find(int l, int r, int i) { if (a[i].r == a[i].l) { k++; cout <<a[i].mark; if (k != n) cout << " "; return; } if (a[i].mark)move(i); int mid = (a[i].r + a[i].l) / 2; if (mid >= r)find(l, r, i * 2); else if (mid < l)find(l, r, i * 2 + 1); else find(l, mid, i * 2), find(mid + 1, r, i * 2 + 1); } int main() { while (cin >> n, n) { set(1, n, 1); k = 0; for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; add(x, y, 1); } find(1, n, 1); cout << endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-669988.html

    最新回复(0)