結果
| 問題 |
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;
}
chocorusk