1. 程式人生 > >Pair Of Lines Codeforces 961D (隨機)

Pair Of Lines Codeforces 961D (隨機)

傳送門 啊啊啊 line iostream for syn sin end cloc

傳送門

題意:給你n個點,問能不能找兩條直線經過所有點

題解:打比賽的時候很傻逼的認為要確定一條一條直線必須要斜率和截距,但是我tm是在枚舉與點i的連線啊啊啊啊,點i是固定的所以只要斜率相等就能判斷是不是同一條直線。隨機算法隨機找兩個點確定一條直線,如果枚舉的點不在該直線上則將它加入到vector中,如果不在點上的直線超過1個,則以vector中的第一個點和第二點作為第二條直線,枚舉vector中的點,如果某一點仍然不在第二條直線上,則直接說明該選點不成立,繼續隨機。如果隨機時間超過1.7s仍然沒有跑出yes則直接判斷他是錯誤的。

#include <iostream>
#include 
<cstdio> #include <cmath> #include <algorithm> #include <map> #include <queue> #include <vector> #include <cstring> #include <iomanip> #include <set> #include<ctime> //CLOCKS_PER_SEC #define se second #define fi first #define ll long long #define
lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define Pii pair<int,int> #define Pli pair<ll,int> #define ull unsigned long long #define pb push_back #define fio ios::sync_with_stdio(false);cin.tie(0) const double Pi=3.14159265; const double e=2.71828182; const int N=1e5+5; const ull base
=163; const int INF=0x3f3f3f3f; using namespace std; pair<ll,ll>p[N]; vector<ll>vec; bool same(int i,int j,int k){ return (p[j].fi-p[i].fi)*(p[k].se-p[i].se)-(p[k].fi-p[i].fi)*(p[j].se-p[i].se); } int main(){ fio; srand(time(0)); ll n; cin>>n; for(int i=0;i<n;i++)cin>>p[i].fi>>p[i].se; if(n<=4)return cout<<"YES\n",0; while(clock()<1.7*CLOCKS_PER_SEC){ ll t1,t2; do{ t1=rand()%n; t1=(t1*RAND_MAX+rand())%n; t2=rand()%n; t2=(t2*RAND_MAX+rand())%n; }while(t1==t2); //cout<<t1<<" "<<t2<<endl; for(int i=0;i<n;i++){ if(same(t1,t2,i))vec.pb(i); } if(vec.size()<=1)return cout<<"YES\n",0; else { int x=vec[0]; int y=vec[1]; int i; for( i=0;i<vec.size();i++){ if(same(x,y,vec[i]))break; } if(i==vec.size())return cout<<"YES\n",0; vec.clear(); } } cout<<"NO\n"; return 0; }

Pair Of Lines Codeforces 961D (隨機)