ZOJ 3745 Salary Increasing

/* 地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3745
*
*  题意:给出N个人的工资,再给工资在 [l,r] 区间的人加工资c,求q次操作后,老板需要给的总工资。
*
*  思路:用i保存工资值,a[i]保存工资为i的人数,ans=a[i]*i。
*
*/
 
 
#include <cstdio>
#include <cstring>
#define N 200005
long long a[N]; // 防止乘法溢出
int main()
{
    int n, q;
    while (scanf("%d%d", &n, &q) != EOF)
    {
        memset(a, 0, sizeof(a));
        for (int i = 0; i < n; i++){
            int in;
            scanf("%d", &in);
            a[in]++;
        }
        for (int i = 0; i < q; i++){
            int l, r, c;
            scanf("%d%d%d", &l, &r, &c);
            for (int j = r; j >= l; j--){ //从小到大的话,会影响区间后面的值。
                if (a[j]){
                    a[j + c] += a[j];
                    a[j] = 0;
                }
            }
        }
        long long  ans = 0;
        for (int i = 0; i < N; i++)
            ans += a[i] * i;
        printf("%lld\n", ans);
    }
    return 0;
}


你可能感兴趣的:(C++,c,ACM)