Color the ball

来源:互联网 发布:js鼠标移入添加样式 编辑:程序博客网 时间:2024/06/06 01:10

H - Color the ball

 
#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;struct node{int l, r, sum, _max;}dp[200005 * 4];int n;int cnt;void Creat(int l, int r, int i)//初始化线段树{dp[i].l = l;dp[i].r = r;dp[i].sum = dp[i]._max = 0;if (l == r)//当为最小子区间时输入值{dp[i].sum = dp[i]._max = 0;return;}int mid = (l + r) / 2;//分半Creat(l, mid, i * 2);Creat(mid + 1, r, i * 2 + 1);dp[i].sum = dp[i * 2].sum + dp[i * 2 + 1].sum;}void Pushdow(int i)//向下修改一层{dp[i * 2].sum += (dp[i * 2].r - dp[i * 2].l + 1)*dp[i]._max;dp[i * 2]._max += dp[i]._max;dp[i * 2 + 1].sum += (dp[i * 2 + 1].r - dp[i * 2 + 1].l + 1)*dp[i]._max;dp[i * 2 + 1]._max += dp[i]._max;dp[i]._max = 0;}void Change(int a, int b, int i)//从a-b区间每{if (dp[i].l == a&&dp[i].r == b){dp[i].sum += dp[i].r - dp[i].l + 1;dp[i]._max += 1;return;}if (dp[i]._max){Pushdow(i);}int mid = (dp[i].l + dp[i].r) / 2;if (b <= mid){Change(a, b, i * 2);}else if (a > mid){Change(a, b, i * 2 + 1);}else{Change(a, mid, i * 2);Change(mid + 1, b, i * 2 + 1);}dp[i].sum = dp[i * 2].sum + dp[i * 2 + 1].sum;}void Find(int i)//因为要输出全部数据所以直接一个参数就可以了{if (dp[i].l == dp[i].r)//当条件成立时,该节点为叶子节点,输出该数即可{if (cnt != 0)cout << ' ';//注意格式不然会PE  QAQcnt++;cout << dp[i].sum;return;}if (dp[i]._max)Pushdow(i);Find(i * 2);Find(i * 2 + 1);}int main(){while (cin >> n){if (n == 0)break;cnt = 0;Creat(1, n, 1);for (int i = 0; i < n; i++){int c, d;scanf("%d%d", &c, &d);Change(c, d, 1);}Find(1);cout << endl;}return 0;}


0 0