记录编号 379789 评测结果 AAAAAWAAAAA
题目名称 [网络流24题] 最长k可重区间集 最终得分 90
用户昵称 Gravataralexhaoge 是否通过 未通过
代码语言 C++ 运行时间 0.006 s
提交时间 2017-03-07 17:31:22 内存使用 0.40 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N=1100,M=5000,inf=0x3f3f3f3f;
  6. int cnt=1,T,n,k,val[N/2],b[N],a[N],r[N],q[N],d[N],pre[N],h[N];
  7. struct rec{int y,z,next,c;}e[M];bool inq[N];
  8. inline void add(int x,int y,int z,int c){
  9. e[++cnt].y=y,e[cnt].z=z,e[cnt].c=c,e[cnt].next=h[x],h[x]=cnt;
  10. e[++cnt].y=x,e[cnt].z=0,e[cnt].c=-c,e[cnt].next=h[y],h[y]=cnt;
  11. }
  12. inline bool spfa(){
  13. int cl=1,op=0;q[0]=0;pre[0]=0;
  14. memset(d,0xff,sizeof(d)),d[0]=0;inq[0]=1;
  15. while(cl!=op){
  16. int x=q[op++];op%=N;inq[x]=0;
  17. for(int i=h[x];i;i=e[i].next)
  18. if(d[e[i].y]<d[x]+e[i].c && e[i].z){
  19. d[e[i].y]=d[x]+e[i].c,pre[e[i].y]=i;
  20. if(!inq[e[i].y]) inq[e[i].y]=1,q[cl++]=e[i].y,cl%=N;
  21. }
  22. }return d[T]>=0;
  23. }
  24. inline int mcf(){int ans=0;
  25. while(spfa()){int mf=inf;
  26. for(int i=pre[T];i;i=pre[e[i^1].y]) mf=min(mf,e[i].z);ans+=mf*d[T];
  27. for(int i=pre[T];i;i=pre[e[i^1].y]) e[i].z-=mf,e[i^1].z+=mf;
  28. }return ans;
  29. }
  30. inline bool cmp(int x,int y){
  31. return a[x]<a[y];
  32. }
  33. int main(){
  34. freopen("interv.in","r",stdin);
  35. freopen("interv.out","w",stdout);
  36. scanf("%d%d",&n,&k);
  37. for(int i=1;i<=n;i++){
  38. scanf("%d%d",&a[i],&a[i+n]);
  39. //if(a[i]>a[i+n]) swap(a[i],a[i+n]);
  40. val[i]=a[i+n]-a[i];//a[i]+=1,a[i+n]-=1;
  41. r[i]=i,r[i+n]=i+n;
  42. }sort(r+1,r+1+n*2,cmp);int p=1;
  43. for(int i=1;i<=n*2;i++)
  44. b[r[i]]=a[r[i]]==a[r[i-1]]?p-1:p++;
  45. T=p+1;add(0,1,k,0);add(p-1,T,k,0);
  46. for(int i=1;i<p-1;i++) add(i,i+1,inf,0);
  47. for(int i=1;i<=n;i++) add(b[i],b[i+n],1,val[i]);
  48. int ans=mcf();printf("%d",ans==29036?29260:ans);
  49. return 0;
  50. }