明明看题解都和我差不多,然而还是错的:
#include<bits/stdc++.h>
#define CEIL(A,B) ((A)/(B)+((A)%(B)==0?0:1))
using namespace std;
struct role
{
int l,h;
role():
l(-1),
h(1001)
{
}
};
int n,m,k;
int x[10001],y[10001];
role maps[10001];
int f[10001][1001];
int minw[10001];
int cnt=0;
inline void init()
{
memset(f,0x3f,sizeof(f));
memset(minw,0x3f,sizeof(minw));
scanf("%d %d %d",&n,&m,&k);
for(int i=0;i<n;i++) scanf("%d %d",&x[i],&y[i]);
for(int i=1;i<=k;i++)
{
int p,l,h;
scanf("%d %d %d",&p,&l,&h);
maps[p].l=l;
maps[p].h=h;
}
}
inline void solve()
{
for(int i=1;i<=m;i++) f[0][i]=0;
for(int i=1;i<=n;i++)
{
for(int j=max(1,maps[i].l+1);j<=min(m,maps[i].h-1);j++)
{
f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);
if(j==m)
{
for(int k=m-x[i-1];k<=m;k++) f[i][j]=min(f[i][j],min(f[i-1][k]+1,f[i][k]+1));
}
else f[i][j]=min(f[i][j],min(f[i-1][j-x[i-1]]+1,f[i][j-x[i-1]]+1));
minw[i]=min(minw[i],f[i][j]);
}
if(minw[i]!=0x3f3f3f3f&&maps[i].l!=-1&&maps[i].h!=1001) cnt++;
}
// for(int i=m;i>=0;i--)
// {
// for(int j=0;j<=n;j++) printf("%-3d",f[j][i]==0x3f3f3f3f?-1:f[j][i]);
// printf("\n");
// }
// printf("\n\n");
// for(int i=0;i<=n;i++) printf("%-5d",maps[i].h);
// printf("\n");
// for(int i=0;i<=n;i++) printf("%-5d",maps[i].l);
// printf("\nk=%d\n",k);
}
inline void print()
{
if(cnt==k)
{
int ans=0x3f3f3f3f;
for(int i=0;i<=m;i++) ans=min(ans,f[n][i]);
printf("1\n%d\n",ans);
}
else printf("0\n%d\n",cnt);
}
int main()
{
// freopen("P1941_7.in","r",stdin);
// freopen("P1941.txt","w",stdout);
init();
solve();
print();
return 0;
}