你按照x升序y降序排一遍序,按照x升序y升序再排一遍序,两遍一拼合,跑一个贪心就过了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<bits/stdc++.h> using namespace std; int n; struct node{ int x,y; bool operator<(const node &r)const{ if(x!=r.x)return x<r.x; return y>r.y; } }; bool cmp(node x,node y){ if(x.x!=y.x)return x.x<y.x; return x.y<y.y; } vector<node> v; bool buc[1000005]; int main(){ ios::sync_with_stdio(0);cin.tie(0); cin>>n; for(int i=1;i<=n;i++){ node x;cin>>x.x>>x.y; if(x.x>x.y)swap(x.x,x.y); v.push_back(x); } sort(v.begin(),v.end()); int tot=0,ans=0; for(int i=0;i<n;i++){ if(!buc[v[i].x])buc[v[i].x]=1; else buc[v[i].y]=1; } while(buc[++tot]){} ans=max(ans,tot-1);tot=0; memset(buc,0,sizeof buc); sort(v.begin(),v.end(),cmp); for(int i=0;i<n;i++){ if(!buc[v[i].x])buc[v[i].x]=1; else buc[v[i].y]=1; } while(buc[++tot]){} ans=max(ans,tot-1); cout<<ans<<endl; return 0; }
|