您的位置:首页 > 其它

URAL 1491. Unreal Story(区间染色, 数学啊)

2015-02-07 19:41 381 查看
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1491

You won't believe it, but once, in ancient times, there happened the following story. At a meeting of the Round Table, King Arthur stood up and said: “Let each knight sitting on my right not farther
than b places and not nearer than a places receive from me c gold coins.” If we number the knights from 1 to N counter-clockwise so that the knight sitting on Arthur's right is numbered 1 and the knight sitting on Arthur's
left is numbered N, then we have that the king gave c gold coins to the knights with numbers a, a + 1, …, b.

Having looked at Arthur's generous deed, the noble knights started to stand up one after another and tell their three numbers ai, bi, ci (1 ≤ i ≤ N).
After each of these utterances, the knights with numbers from ai to bi received ci gold
coins each from the king.

Since each knight was very noble, either ai > i or bi < i.
You task is to help the knights to learn how many gold coins each of them received.


Input

The first line contains the number of King Arthur's knights N (2 ≤ N ≤ 100000). In the next line, there are integers a, b, and c, which the king said (1 ≤ a ≤ b ≤ N;
1 ≤ c ≤ 10000). Each of the next N lines contains three integers ai, bi, ci,
which the ith knight said (1 ≤ ai ≤ bi ≤ N; 1 ≤ ci ≤ 10000).


Output

Output N numbers separated with a space. The ith number is the number of gold coins received by theith knight.


Samples

inputoutput
4
2 3 2
2 4 1
3 4 1
1 2 1
1 1 1

2 4 4 2

7
1 7 1
2 3 4
3 5 3
1 2 1
5 7 4
2 4 10
3 4 2
1 6 3

5 19 23 19 11 8 5

Problem Author: Alexander Toropov

Problem Source: XIII-th USU Junior Contest, October 2006

题意:

给出染色区间,求每个区间被染色次数!

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
int main()
{
    int n;
    int aa, bb, cc;
    int a, b, c;
    int s[100017];
    while(~scanf("%d",&n))
    {
        memset(s,0,sizeof(s));
        scanf("%d%d%d",&aa,&bb,&cc);
        s[aa]+=cc, s[bb+1]-=cc;
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            s[a]+=c, s[b+1]-=c;
        }
        int ans = 0;
        ans+=s[1];
        printf("%d",ans);
        for(int i = 2; i <= n; i++)
        {
            ans+=s[i];
            printf(" %d",ans);
        }
        printf("\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: