Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 4970 | Accepted: 1565 |
Description
Being the team's leader you want to determine for each worker the interval that he should paint, knowing that the total income should be maximal. The total income represents the sum of the workers personal income.
Write a program that determines the total maximal income obtained by the K workers.
Input
Input
N K
L1 P1 S1
L2 P2 S2
...
LK PK SK
Semnification
N -the number of the planks; K ? the number of the workers
Li -the maximal number of planks that can be painted by worker i
Pi -the sum received by worker i for a painted plank
Si -the plank in front of which sits the worker i
Output
Sample Input
8 4 3 2 2 3 2 3 3 3 5 1 1 7
Sample Output
17
Hint
the worker 1 paints the interval [1, 2];
the worker 2 paints the interval [3, 4];
the worker 3 paints the interval [5, 7];
the worker 4 does not paint any plank
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<queue>
#include<deque>
using namespace std;
const int N=16000+10;
const int K=100+10;
const int inf=0x3f3f3f3f;
void getint(int&num){
char c;int flag=1;num=0;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9'){num=num*10+c-48;c=getchar();}
num*=flag;
}
struct worker{
int l,p,s;
bool operator < (const worker &x)const{
return s<x.s;
}
}arr[N];
struct node{
int num,pos;
node(){}
node(int a,int b){
num=a,pos=b;
}
};
deque<node> q;
int n,k,dp[K][N];
int main(){
while(~scanf("%d %d",&n,&k)){
for(int i=1;i<=k;i++)
getint(arr[i].l),getint(arr[i].p),getint(arr[i].s);
sort(arr+1,arr+k+1);
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;i++){
while(!q.empty()) q.pop_front();
int tmp=max(arr[i].s-arr[i].l,0);
q.push_back(node(dp[i-1][tmp]-arr[i].p*tmp,tmp));
for(int j=1;j<=n;j++){
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(j>=arr[i].s+arr[i].l) continue ;
while(!q.empty()&&q.front().pos+arr[i].l<j)
q.pop_front();
if(j<arr[i].s){
int now=dp[i-1][j]-arr[i].p*j;
while(!q.empty()&&q.back().num<now)
q.pop_back();
q.push_back(node(now,j));
}
else dp[i][j]=max(dp[i][j],q.front().num+arr[i].p*j);
}
}
printf("%d\n",dp[k][n]);
}
}