题意:在数轴内,给出一些区间,要你在数轴里找一些数出来组成一个集合,使得每个区间中都至少有两个不同的数在这个集合中
解题思路:差分约束,用spfa解的。设d[x]为0到x在集合中的数的个数,那么没输入一个(x,y)就有
d[y]-d[x-1]>=2
又由d[]的性质可知,有
0<=d[i]-d[i-1]<=1
然后建图,我是用向量的,感觉用时很厉害,不过我是卡过去了
982msG++代码:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<vector> #include<queue> using namespace std; typedef struct edge { int next,value; edge(int a,int b){next=a;value=b;} }edge; vector<edge>e[50010]; void add(int x,int y,int value) { e[x].push_back(edge(y,value)); } int d[10010],n; bool vs[10010]; void spfa(int a) { int temp; queue<int>Q; memset(vs,false,sizeof(vs)); memset(d,-20000,sizeof(d)); Q.push(a); d[a]=0; vs[a]=true; while(!Q.empty()) { temp=Q.front(); Q.pop(); int i; for(i=0;i<e[temp].size();i++) { int nx=e[temp][i].next; if(d[nx]<d[temp]+e[temp][i].value) { d[nx]=d[temp]+e[temp][i].value; if(!vs[nx]) { Q.push(nx); vs[nx]=true; } } } vs[temp]=false; } } int main() { int i,j; int x,y,max; while(scanf("%d",&n)!=EOF) { max=0; for(i=0;i<=n;i++) e[i].clear(); for(i=1;i<=n;i++) { scanf("%d %d",&x,&y); if(max<y+1)max=y+1; add(x,y+1,2); } for(i=0;i<=max;i++) { add(i-1,i,0); add(i,i-1,-1); } spfa(0); printf("%d\n",d[max]); } return 0; }