sgu 174 Walls
题意:在第几条线时已有的线组成了封闭图形。
并查集在当前直线将2点检查是否已经连起来了。已经连起来就输出,否则连起来。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #define mkp make_pair using namespace std; const double EPS=1e-8; const int SZ=800010,INF=0x7FFFFFFF; typedef long long lon; int p[SZ]; int n; vector<pair<int,int>> vct; vector<pair<int,int> >ls; void init() { cin>>n; vct.assign(2*n,mkp(0,0)); for(int i=0;i<2*n;++i) { cin>>vct[i].first>>vct[i].second; ls.push_back(vct[i]); } sort(ls.begin(),ls.end()); ls.erase(unique(ls.begin(),ls.end()),ls.end()); for(int i=0;i<SZ;++i)p[i]=i; } int find(int x) { return x==p[x]?x:p[x]=find(p[x]); } void adj(int x,int y) { int rtx=find(x),rty=find(y); p[rtx]=rty; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { init(); int res=0; for(int i=0;i<n;++i) { int pos1=lower_bound(ls.begin(),ls.end(),vct[2*i])-ls.begin(); int pos2=lower_bound(ls.begin(),ls.end(),vct[2*i+1])-ls.begin(); //cout<<i<<" "<<pos1<<" "<<pos2<<endl; if(find(pos1)==find(pos2)) { res=i+1; break; } else {//cout<<"h"<<endl; adj(pos1,pos2); } } cout<<res<<endl; } return 0; }