只过subtask1二分+dp求调
查看原帖
只过subtask1二分+dp求调
639449
Dreamer_002楼主2025/8/3 08:04
//code by Dreamer_002
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 2e5 + 2e3;
const int M = 5005;
struct red{
	int l,r,w;
};
struct blue{
	int l,r;
};
struct qujian{
	int l,r;
};
qujian c[M];
red a[N];
blue b[M];
int n,m,k,pre[M],w[M],cc[M],s[N],ss[N],f[M][M];
bool cmp1(red x,red y){
	return x.l==y.l?x.r<y.r:x.l<y.l;
}
bool cmp2(blue x,blue y){
	return x.l==y.l?x.r<y.r:x.l<y.l;
}
int minn(int a,int b);
int maxx(int a,int b);
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].w);
	}
	sort(a+1,a+1+n,cmp1);
	for(int i=1;i<=n;i++){
		s[i]=s[i-1]+a[i].w;
		ss[i]=ss[i-1]+a[i].r-a[i].l+1;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&b[i].l,&b[i].r);
	}
	sort(b+1,b+1+m,cmp2);
	for(int i=1;i<=m;i++){
		int l=1,r=n+1,mid,ansl=-1,ansr=-1;
		while(l<=r){
			mid=(l+r)>>1;
			if(a[mid].r<b[i].l){
				l=mid+1;
			}
			else{
				r=mid-1;
				ansl=mid;
			}
		}
		if(ansl==-1)continue;
		l=0;r=n;
		while(l<=r){
			mid=(l+r)>>1;
			if(a[mid].l>b[i].r){
				r=mid-1;
			}
			else{
				l=mid+1;
				ansr=mid;
			}
		}
		//if(ansr>n)ansr=n;
		if(ansr==-1)continue;
		c[i].l=ansl;c[i].r=ansr;
		w[i]=s[ansr]-s[ansl-1];
		if(ansr==ansl){
			cc[i]=minn(a[ansl].r,b[i].r)-maxx(a[ansl].l,b[i].l)+1;
		}
		else if(ansr>ansl){
			cc[i]=ss[ansr-1]-ss[ansl];
			cc[i]+=minn(a[ansl].r,b[i].r)-maxx(a[ansl].l,b[i].l)+1;
			cc[i]+=minn(a[ansr].r,b[i].r)-maxx(a[ansr].l,b[i].l)+1;
		}
		else{
			c[i].r=c[i-1].r;c[i].l=-1;
			w[i]=0;
		}
	}
	for(int i=1;i<=m;i++){
		pre[i]=i-1;
		if(c[i].l==-1)continue;
		int l=1,r=i,mid,ans=-1;
		while(l<=r){
			mid=(l+r)>>1;
			if(c[mid].r<c[i].l){
				l=mid+1;
				ans=mid;
			}
			else{
				r=mid-1;
			}
		}
		if(ans==-1) continue;
		pre[i]=ans;
	}
	for(int i=1;i<=m;i++){
		for(int j=k;j>=0;j--){
			if(j>=w[i])
			f[i][j]=maxx(f[i-1][j],f[pre[i]][j-w[i]]+cc[i]);
			else f[i][j]=f[i-1][j];
		}
	}
	int ans=0;
	for(int j=0;j<=k;j++){
		ans=maxx(ans,f[m][j]);
	}
	printf("%d\n",ans);
	return 0;
}
int minn(int a,int b){
	return a<b?a:b;
}
int maxx(int a,int b){
	return a>b?a:b;
}

悲,其余subtask都有A有Wa 记录

2025/8/3 08:04
加载中...