| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
1A 水题没的说!#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int CMax=2510,NMax=2*CMax;
int nn,C,L,PL,Min[CMax],Max[CMax],P[CMax],NUM[CMax];
struct edge {
int num,len;
edge *next,*rev;
}*A[NMax],pool[2*CMax*CMax];
void Build(int x,int y,int z) {
edge *p=&pool[PL++],*q=&pool[PL++];
p->num=y;p->len=z;p->next=A[x];A[x]=p;p->rev=q;
q->num=x;q->len=0;q->next=A[y];A[y]=q;q->rev=p;
}
int level[NMax],q[NMax];
bool makelevel() {
memset(level,-1,sizeof(level));
q[0]=0;level[0]=0;
for(int i=0,bot=1;i<bot;i++) {
int x=q[i];
for(edge *p=A[x];p;p=p->next) if(p->len&&level[p->num]==-1){
level[q[bot++]=p->num]=level[x]+1;
}
}
return level[nn]!=-1;
}
int Find(int a,int alpha) {
if(a==nn) return alpha;
int tot=0,tmp;
for(edge *p=A[a];p&&tot<alpha;p=p->next) {
if(p->len&&level[p->num]==level[a]+1)
if(tmp=Find(p->num,min(p->len,alpha-tot))) {
tot+=tmp;
p->len-=tmp;
p->rev->len+=tmp;
}
}
if(!tot) level[a]=-1;
return tot;
}
int main()
{
scanf("%d%d",&C,&L);
nn=C+L+1;
for(int i=1;i<=C;i++) {
scanf("%d%d",Min+i,Max+i);
if(Min[i]>Max[i]) swap(Min[i],Max[i]);
}
for(int i=1;i<=L;i++) scanf("%d%d",P+i,NUM+i);
for(int i=1;i<=L;i++) {
Build(0,i,NUM[i]);
for(int j=1;j<=C;j++)
if(Min[j]<=P[i]&&P[i]<=Max[j]) Build(i,L+j,1);
}
for(int i=1;i<=C;i++) Build(L+i,nn,1);
int tmp,ret=0;
while(makelevel())
while(tmp=Find(0,100000000)) ret+=tmp;
printf("%d\n",ret);
getchar();getchar();
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator