#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 数据呢?