WA#5#7#10#11#13,我来加入75分大部队了TAT
查看原帖
WA#5#7#10#11#13,我来加入75分大部队了TAT
229446
ephemere楼主2020/9/10 21:15
#include<bits/stdc++.h>
using namespace std;

const int N=1e4+5,M=1e4+5,INF=1e9;//INF=N
int n,m,q,v1[N],v2[N],F[2][N];
int tc=1,ff=1;//统计穿过多少管道 
struct C_ 
{
	int x,l,r;
	friend bool operator<(C_ a,C_ b)
	{
		return a.x<b.x;
	}
}C[N];

int main()
{
	scanf("%d %d %d",&n,&m,&q);
	for(int i=1;i<=n;++i) scanf("%d %d",&v1[i],&v2[i]);
	for(int i=1;i<=q;++i) scanf("%d %d %d",&C[i].x,&C[i].l,&C[i].r);
	sort(C+1,C+q+1);
	
	F[1][0]=F[0][0]=INF;
	
	int I,cnt,last,V;
	for(int i=1;i<=n;++i)
	{
		I=i%2;
		F[I][m]=INF;
		for(int j=1;j<=v1[i];++j)
		{
			last=0;
			for(int s=j;s<m;s+=v1[i])
			{
				V=F[I^1][last]+(s-last)/v1[i];
				F[I][s]=min(INF,V);
				if(s+v2[i]<=m) F[I][s]=min(F[I][s],F[I^1][s+v2[i]]);
				if(F[I^1][s]!=INF&&F[I^1][s]<V) last=s;
			}
			F[I][m]=min(F[I][m],F[I^1][last]+(m-last)/v1[i]+((m-last)%v1[i]!=0));
		}
		
		if(tc<=q&&i==C[tc].x)
		{
			cnt=0;
			for(int j=1;j<=m;++j)
			if(j<=C[tc].l||j>=C[tc].r) F[I][j]=INF;
			else cnt+=(F[I][j]!=INF);
				
			if(cnt==0)
			{
				printf("0\n%d",tc-1);
				return 0;
			}
			else tc++;
		}
	}
	cnt=INF;
	I=n%2;
	for(int i=1;i<=m;++i) cnt=min(F[I][i],cnt);
	
	if(cnt==INF) printf("0\n%d",q);
	else printf("1\n%d",cnt);
}
2020/9/10 21:15
加载中...