题意:某老板要给员工涨薪,每次给工资在[l,r]范围的人涨c单位工资,问最后老板要付多少钱。
思路:这题其实是到水题,放上来的原因是提醒自己认真看题…… 题里有个条件:ri < li+1 看到这个条件基本就做出来了,从这个条件发现区间是不重叠的,因此,直接暴力就可以了,用一个数组num[i]记录工资为i的员工的人数,每次涨薪操作后修改人数就行了。。。
代码:
#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\n",sum); } return 0; }