RT,第一个数据点下载一下就暴毙了。。感觉是dp的枚举顺序有问题。。
//xtwakioi! xtwddYnoi(双重含义)!
#include <bits/stdc++.h>
#define ri register
#define int long long
//#define E (n+1)
using namespace std; const int N=505, M=10010;
inline int read()
{
int s=0, w=1; ri char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
return s*w;
}
int K,E,n,dp[N][M],g[N];
struct Node { int c,f[22]; }q[N][N];
signed main()
{
K=read(), E=read(), n=read();
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
for(ri int i=1;i<=n;i++)
{
int pos=read();
g[pos]++;
int rt=read();
int now=0;
while(rt>=(1ll<<now)) q[pos][g[pos]].f[now]=(1ll<<now), rt-=(1ll<<now), now++;
if(rt) q[pos][g[pos]].f[now]=rt;
sort(q[pos][g[pos]].f,q[pos][g[pos]].f+now+1);
q[pos][g[pos]].c=read();
}
for(ri int i=1;i<=E;i++)
{
for(ri int j=K;~j;j--)
{
dp[i][j]=dp[i-1][j];
if(!g[i]) dp[i][j]=dp[i-1][j]+j*j;
else
{
for(ri int x=1;x<=g[i];x++)
{
for(ri int k=20;~k;k--)
{
if(!q[i][x].f[k]) continue;
if(j<q[i][x].f[k]) continue;
dp[i][j]=min(dp[i][j],dp[i-1][j-q[i][x].f[k]]+(j-q[i][x].f[k])*(j-q[i][x].f[k])+q[i][x].c*q[i][x].f[k]);
}
}
}
}
}
//for(ri int i=1;i<=E;i++)
//for(ri int j=0;j<=K;j++) printf("dp[%lld][%lld] = %lld\n",i,j,dp[i][j]);
printf("%lld\n",dp[E][K]);
return 0;
}