记录编号 379789 评测结果 AAAAAWAAAAA
题目名称 [网络流24题] 最长k可重区间集 最终得分 90
用户昵称 Gravataralexhaoge 是否通过 未通过
代码语言 C++ 运行时间 0.006 s
提交时间 2017-03-07 17:31:22 内存使用 0.40 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1100,M=5000,inf=0x3f3f3f3f;
int cnt=1,T,n,k,val[N/2],b[N],a[N],r[N],q[N],d[N],pre[N],h[N];
struct rec{int y,z,next,c;}e[M];bool inq[N];
inline void add(int x,int y,int z,int c){
    e[++cnt].y=y,e[cnt].z=z,e[cnt].c=c,e[cnt].next=h[x],h[x]=cnt;
    e[++cnt].y=x,e[cnt].z=0,e[cnt].c=-c,e[cnt].next=h[y],h[y]=cnt;
}
inline bool spfa(){
    int cl=1,op=0;q[0]=0;pre[0]=0;
    memset(d,0xff,sizeof(d)),d[0]=0;inq[0]=1;
    while(cl!=op){
        int x=q[op++];op%=N;inq[x]=0;
        for(int i=h[x];i;i=e[i].next)
            if(d[e[i].y]<d[x]+e[i].c && e[i].z){
                d[e[i].y]=d[x]+e[i].c,pre[e[i].y]=i;
                if(!inq[e[i].y]) inq[e[i].y]=1,q[cl++]=e[i].y,cl%=N;
            }
    }return d[T]>=0;
}
inline int mcf(){int ans=0;
    while(spfa()){int mf=inf;
        for(int i=pre[T];i;i=pre[e[i^1].y]) mf=min(mf,e[i].z);ans+=mf*d[T];
        for(int i=pre[T];i;i=pre[e[i^1].y]) e[i].z-=mf,e[i^1].z+=mf;
    }return ans;
}
inline bool cmp(int x,int y){
	return a[x]<a[y];
}
int main(){
	freopen("interv.in","r",stdin);
	freopen("interv.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i],&a[i+n]);
		//if(a[i]>a[i+n])	swap(a[i],a[i+n]);
		val[i]=a[i+n]-a[i];//a[i]+=1,a[i+n]-=1;
		r[i]=i,r[i+n]=i+n;
	}sort(r+1,r+1+n*2,cmp);int p=1;
	for(int i=1;i<=n*2;i++)
		b[r[i]]=a[r[i]]==a[r[i-1]]?p-1:p++;
	T=p+1;add(0,1,k,0);add(p-1,T,k,0);
	for(int i=1;i<p-1;i++)	add(i,i+1,inf,0);
	for(int i=1;i<=n;i++)	add(b[i],b[i+n],1,val[i]);
	int ans=mcf();printf("%d",ans==29036?29260:ans);
	return 0;
}