結果
問題 | No.947 ABC包囲網 |
ユーザー | chocorusk |
提出日時 | 2019-12-10 07:54:56 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 55 ms / 2,000 ms |
コード長 | 2,107 bytes |
コンパイル時間 | 1,430 ms |
コンパイル使用メモリ | 121,736 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-23 19:57:42 |
合計ジャッジ時間 | 4,362 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 60 |
ソースコード
#include <cstdio> #include <cstring> #include <iostream> #include <string> #include <cmath> #include <bitset> #include <vector> #include <map> #include <set> #include <queue> #include <deque> #include <algorithm> #include <complex> #include <unordered_map> #include <unordered_set> #include <random> #include <cassert> #include <fstream> #include <utility> #include <functional> #include <time.h> #include <stack> #include <array> #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair<ll, ll> P; bool myon(ll x1, ll y1, ll x2, ll y2){ ll s=x1*y2-x2*y1; if(s>0) return true; if(s==0){ if(x1*x2+y1*y2>0) return true; else return false; } return false; } int main() { int n; cin>>n; ll x[4040], y[4040]; for(int i=0; i<n; i++){ cin>>x[i]>>y[i]; } vector<int> ind, ind1, ind2; for(int i=0; i<n; i++){ if(myon(1, 0, x[i], y[i])) ind1.push_back(i); else ind2.push_back(i); } auto comp=[](ll x1, ll y1, ll x2, ll y2){ return x1*y2-x2*y1>0;}; sort(ind1.begin(), ind1.end(), [&](int i, int j){ return comp(x[i], y[i], x[j], y[j]);}); sort(ind2.begin(), ind2.end(), [&](int i, int j){ return comp(x[i], y[i], x[j], y[j]);}); ind=ind1; for(auto i:ind2) ind.push_back(i); for(auto i:ind1) ind.push_back(i); for(auto i:ind2) ind.push_back(i); int l[4040], r[4040]; int t=0; for(int i=0; i<n; i++){ while(t<i+n && x[ind[i]]*y[ind[t]]-y[ind[i]]*x[ind[t]]>=0){ t++; } l[i]=t%n; //cout<<l[i]<<endl; } t=0; for(int i=0; i<n; i++){ while(t<i+n && myon(x[ind[i]], y[ind[i]], x[ind[t]], y[ind[t]])){ t++; } r[i]=t%n; //cout<<r[i]<<endl; } ll ans=0; for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ if(x[ind[i]]*y[ind[j]]-x[ind[j]]*y[ind[i]]<=0) continue; //cout<<i<<" "<<j<<" "<<l[i]<<" "<<r[j]<<endl; int a=((r[j]-l[i])%n+n)%n; ans+=a; } } cout<<ans/2<<endl; return 0; }