自以为学了几年OI,没想到橙题都不会
80pts,WA#5
code:(没删freopen)
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define getchar() (read.getc())
#define putchar(c) (print.putc(c))
#define puts(s) MYPUTS(s)
struct in{
in(){freopen("_in.txt","r",stdin);}
char buf[1<<20],*p1,*p2;
inline char getc(){return (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++);}
int operator()(){
int x=0,f=1;char ch=getc();
while (!isdigit(ch)&&ch!=EOF){if(ch=='-')f=-1;ch=getc();}
while (isdigit(ch)){x=x*10+ch-48;ch=getc();}
return x*f;
}
}read;
struct out{
char buf[1<<20],*p,*end;
out(){freopen("_out.txt","w",stdout),p=buf;end=buf+(1<<20);}
inline void putc(char c){if(p==end)fwrite(buf,1,1<<20,stdout),p=buf;*p++=c;}
void operator()(int a){
if(a<0)putc('-'),a=-a;
if(a>=10)(*this)(a/10);
putc(a%10^48);
}
~out(){fwrite(buf,1,p-buf,stdout);}
}print;
inline void MYPUTS(const char*str){for(int i=0;str[i];i++)putchar(str[i]);putchar('\n');}
int m=read(),n=read();
int h[1010],e[1010],ne[1010],idx;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int weight[1010],value[1010];
int*dp=new int[2010];
signed main(){
memset(dp,0xee,8040),dp+=1005;
memset(h,-1,sizeof(h)),memset(dp,0,8040);
for(int i=1;i<=n;i++){
weight[i]=read(),value[i]=read();
add(read(),i);
}
for(int i=1;~h[i];i++)
for(int j=m;~j;j--)
for(int k=h[i];~k;k=ne[k])
dp[j]=max(dp[j-weight[e[k]]]+value[e[k]],dp[j]);
print(dp[m]);
return ~EOF;
}