记录编号 |
379789 |
评测结果 |
AAAAAWAAAAA |
题目名称 |
[网络流24题] 最长k可重区间集 |
最终得分 |
90 |
用户昵称 |
alexhaoge |
是否通过 |
未通过 |
代码语言 |
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;
- }