RT,具体思路和题解里的都一样,估计是某个细节挂了,但我一直没有找出来QAQ,求大佬帮忙查错
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n,m,k,ans,flag;
int vis[100100],low[100100],top[100100],up[100100],down[100100];
int f[10103][1103];
struct node{
int id,p;
}tump[100100];
bool cmp(node a,node b)
{
return a.p<b.p;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;++i)scanf("%d%d",&up[i],&down[i]);
for(int i=1;i<=k;++i)
{
int a;
scanf("%d%d%d",&a,&low[i],&top[i]);
tump[i].id=i;
tump[i].p=a;
}
sort(tump+1,tump+1+k,cmp);
memset(f,0x3f,sizeof(f));
for(int i=1;i<=k;++i)vis[tump[i].p]=tump[i].id;
for(int i=1;i<=m;++i)f[0][i]=0;
if(tump[1].p==0&&tump[1].id)
{
int cur=tump[1].id;
for(int i=0;i<=low[cur];++i)f[0][i]=inf;
for(int i=m;i>=top[cur];--i)f[0][i]=inf;
}
for(int i=1;i<=n;++i)
{
if(vis[i])
{
int cur=vis[i];
for(int j=top[cur]-1;j>low[cur];--j)f[i][j]=min(f[i][j],f[i-1][j+down[i-1]]);
for(int j=low[cur]+1;j<top[cur];++j)
{
if(j>up[i-1])f[i][j]=min(f[i][j],f[i-1][j-up[i-1]]+1);
if(j>up[i])f[i][j]=min(f[i][j],f[i][j-up[i]]+1);
if(j==m)
{
for(register int l=m-up[i-1];l<=m;++l)f[i][j]=min(f[i][j],f[i-1][l]+1);
for(register int l=m-up[i];l<=m;++l)f[i][j]=min(f[i][j],f[i][l]+1);
}
}
}
else
{
for(int j=m-down[i-1];j>=1;--j)f[i][j]=min(f[i][j],f[i-1][j+down[i-1]]);
for(int j=1;j<=m;++j)
{
if(j>up[i-1])f[i][j]=min(f[i][j],f[i-1][j-up[i-1]]+1);
if(j>up[i])f[i][j]=min(f[i][j],f[i][j-up[i]]+1);
if(j==m)
{
for(register int l=m-up[i-1];l<=m;++l)f[i][j]=min(f[i][j],f[i-1][l]+1);
for(register int l=m-up[i];l<=m;++l)f[i][j]=min(f[i][j],f[i][l]+1);
}
}
}
}
int ans=inf;
for(int i=1;i<=m;++i)ans=min(ans,f[n][i]);
if(ans==inf)
{
int sum=0;
printf("0\n");
for(int i=n-1;i>=0;--i)
{
if(vis[i])++sum;
for(int j=1;j<=m;++j)
if(f[i][j]!=inf)
{
printf("%d",k-sum);
return 0;
}
}
printf("0");
}
else printf("1\n%d",ans);
return 0;
}