• zoj3745 Salary Increasing


    OJ Problem Set - 3745

    Salary Increasing

    Time Limit: 2 Seconds      Memory Limit: 65536 KB

    Edward has established a company with n staffs. He is such a kind man that he did Q times salary increasing for his staffs. Each salary increasing was described by three integers (l, r, c). That means Edward will add c units money for the staff whose salaxy is in range [l, r] now. Edward wants to know the amount of total money he should pay to staffs after Q times salary increasing.

    Input

    The input file contains multiple test cases.

    Each case begin with two integers : n -- which indicate the amount of staff; Q -- which indicate Q times salary increasing. The following n integers each describes the initial salary of a staff(mark as ai). After that, there are Q triples of integers (li, ri, ci) (i=1..Q) which describe the salary increasing in chronological.

    1 ≤ n ≤ 105 , 1 ≤ Q ≤ 105 , 1 ≤ ai ≤ 105 , 1 ≤ liri ≤ 105 , 1 ≤ ci ≤ 105 , ri < li+1

    Process to the End Of File.

    Output

    Output the total salary in a line for each case.

    Sample Input

    4 1
    1 2 3 4
    2 3 4
    

    Sample Output

    18
    

    Hint

    {1, 2, 3, 4} → {1, 4, 6, 7}.


    Author: CHEN, Weijie
    Contest: ZOJ Monthly, December 2013

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<cmath>
    #include<vector>
    #define inf 0x3f3f3f3f
    #define Inf 0x3FFFFFFFFFFFFFFFLL
    #define eps 1e-9
    #define pi acos(-1.0)
    using namespace std;
    typedef long long ll;
    const int maxn=100000+10;
    int num[maxn];
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int n,q;
        while(~scanf("%d%d",&n,&q))
        {
            int tmp;
            ll sum=0;
            memset(num,0,sizeof(num));
            for(int i=0;i<n;++i)
            {
                scanf("%d",&tmp);
                num[tmp]++;
                sum+=tmp;
            }
            int l,r,c;
            while(q--)
            {
                scanf("%d%d%d",&l,&r,&c);
                //if(l>r) swap(l,r);
                for(int i=r;i>=l;--i)
                {
                    sum+=(ll)c*num[i];
                    if(i+c<maxn) num[i+c]+=num[i];
                    num[i]=0;
                }
            }
            printf("%lld
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    团队展示
    第二次结对编程作业
    第12组 团队展示
    第一次结对编程作业
    第一次个人编程作业
    软工第一次作业
    第十章 创建计算字段
    第九章 用正则表达式进行搜索
    第八章 用通配符进行过滤
    第七章 数据过滤
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4665254.html
Copyright © 2020-2023  润新知