#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<sstream> #include<algorithm> #include<queue> #include<deque> #include<iomanip> #include<vector> #include<cmath> #include<map> #include<stack> #include<set> #include<fstream> #include<memory> #include<list> #include<string> using namespace std; typedef long long LL; typedef unsigned long long ULL; #define MAXN 100001 #define L 31 #define INF 1000000009 #define eps 0.00000001 struct node { LL l, r, data; }T[MAXN*4+10]; LL n,a[MAXN]; LL Query(LL p, LL k) { if (T[p].l == T[p].r) return T[p].data; LL mid = (T[p].l + T[p].r) >> 1; LL sum = T[p].data; if (k <= mid) sum += Query(p << 1, k); else sum += Query(p << 1 | 1, k); return sum; } void Build(LL p, LL l, LL r) { T[p].l = l, T[p].r = r, T[p].data = 0; if (l == r) { T[p].data = a[l]; return; } LL mid = (l + r) >> 1; Build(p << 1, l, mid); Build(p <<1 | 1, mid + 1, r); } void Insert(LL p, LL l, LL r, LL num) { //cout << p << ‘ ‘ << l << ‘ ‘ << r << ‘ ‘ << num << endl; if (l <= T[p].l&&r >= T[p].r) { T[p].data += num; return; } LL mid = (T[p].l + T[p].r) / 2; if (r <= mid) Insert(p << 1, l, r, num); else if (l > mid) Insert(p << 1 | 1, l, r, num); else { Insert(p << 1, l, mid, num); Insert(p << 1 | 1, mid + 1, r, num); } } int main() { while (scanf("%lld", &n), n) { LL t1, t2; memset(a, 0, sizeof(a)); Build(1, 1, n); for (LL i = 1; i <= n; i++) { scanf("%lld%lld", &t1, &t2); Insert(1, t1, t2, 1); } for (LL i = 1; i <= n; i++) { if (i>1) printf(" "); printf("%lld", Query(1, i)); } printf("\n"); } return 0; }
|
||||||||||
Color the ballTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 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)。 Output 每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。 Sample Input 3 Sample Output 1 1 1 Author 8600 |
时间: 2024-10-12 04:30:48