求 hack
查看原帖
求 hack
807375
2021CHD楼主2024/9/29 22:48
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int i,j,n,m,k,lb[6000],rb[6000],w[6000],v[6000],last[6000],ll,rr,f[6000][6000];
int max(int a,int b)
{
	if(a>b)
	return a;
	else
	return b;
}
int min(int a,int b)
{
	if(a<b)
	return a;
	else
	return b;
}
class segment
{
	public:
	int l,r;
	segment():l(0),r(0){}
	segment(const segment &x):l(x.l),r(x.r){}
	bool operator < (segment x) const
	{
		return this->l<x.l;
	}
	segment & operator = (segment x)
	{
		this->l=x.l;
		this->r=x.r;
		return *this;
	}
	void read()
	{
		scanf("%d%d",&this->l,&this->r);
	}
	bool operator && (segment x) const
	{
		return max(this->l,x.l)<=min(this->r,x.r);
	}
	int operator & (segment x) const
	{
		return max(min(this->r,x.r)-max(this->l,x.l)+1,0);
	}
}b[6000],qb[6000];
class weighted_segment:public segment
{
	public:
	int v;
	weighted_segment():segment(),v(0){}
	weighted_segment(const weighted_segment &x):segment(x),v(x.v){}
	weighted_segment & operator = (weighted_segment x)
	{
		segment::operator=(x);
		this->v=x.v;
		return *this;
	}
	void read()
	{
		segment::read();
		scanf("%d",&this->v);
	}
}r[210000],qr[210000];
template<class T>void sort(T *a,T *q,int l,int r)
{
	int mid=(l+r)/2,i=l,j=mid+1,k=l;
	if(l==r)
	{
		q[l]=a[l];
		return;
	}
	sort(a,q,l,mid);
	sort(a,q,mid+1,r);
	while(i<=mid&&j<=r)
	{
		if(q[i]<q[j])
		{
			a[k]=q[i];
			i++;
		}
		else
		{
			a[k]=q[j];
			j++;
		}
		k++;
	}
	while(i<=mid)
	{
		a[k]=q[i];
		i++;
		k++;
	}
	while(j<=r)
	{
		a[k]=q[j];
		j++;
		k++;
	}
	for(i=l;i<=r;i++)
	q[i]=a[i];
}
main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=n;i++)
	r[i].read();
	for(i=1;i<=m;i++)
	b[i].read();
	sort(r,qr,1,n);
	sort(b,qb,1,m);
	ll=1;
	for(i=1;i<=m;i++)
	{
		while(rr<n&&(r[rr+1]<b[i]||r[rr+1]&&b[i]))
		rr++;
		while(ll<=n&&r[ll]<b[i]&&!(r[ll]&&b[i]))
		ll++;
		lb[i]=ll;
		rb[i]=rr;
		for(j=ll;j<=rr;j++)
		{
			w[i]=w[i]+r[j].v;
			v[i]=v[i]+(r[j]&b[i]);
		}
	}
	ll=1;
	for(i=2;i<=m;i++)
	{
		if(ll<i&&(lb[ll]>rb[ll]||lb[i]>rb[i]||rb[ll]<lb[i]))
		ll++;
		last[i]=ll-1;
	}
	for(i=1;i<=m;i++)
	{
		for(j=0;j<=k;j++)
		{
			f[i][j]=f[i-1][j];
			if(j>=w[i])
			f[i][j]=max(f[i][j],f[last[i]][j-w[i]]+v[i]);
		}
	}
	printf("%d",f[m][k]);
}

评测记录,WA了 29 个点,样例都过了,不知道哪里有错。

各位能否帮忙指出错误或者给出 hack 数据呢?

2024/9/29 22:48
加载中...