結果
| 問題 |
No.1144 Triangles
|
| ユーザー |
chocorusk
|
| 提出日時 | 2020-08-01 01:24:21 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 424 ms / 3,000 ms |
| コード長 | 1,961 bytes |
| コンパイル時間 | 1,518 ms |
| コンパイル使用メモリ | 133,252 KB |
| 最終ジャッジ日時 | 2025-01-12 12:06:21 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 25 |
ソースコード
#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<int, int> P;
typedef pair<ll, ll> P;
vector<P> sort_points(vector<P> v){
int n=v.size();
vector<P> p1, p2;
int z=0;
for(int i=0; i<n; i++){
ll x=v[i].first, y=v[i].second;
if(x==0 && y==0) z++;
else if(y>0 || (x<0 && y==0)) p2.push_back({x, y});
else p1.push_back({x, y});
}
auto comp=[](P p, P q){ return p.first*q.second>p.second*q.first;};
sort(p1.begin(), p1.end(), comp);
sort(p2.begin(), p2.end(), comp);
vector<P> ret;
for(auto p:p1) ret.push_back(p);
//while(z--) ret.push_back({0, 0});
for(auto p:p2) ret.push_back(p);
return ret;
}
const ll MOD=1e9+7;
int main()
{
int n; cin>>n;
ll x[2020], y[2020];
for(int i=0; i<n; i++) cin>>x[i]>>y[i];
ll ans=0;
for(int i=0; i<n; i++){
vector<P> v(n);
for(int j=0; j<n; j++){
v[j]=P(x[j]-x[i], y[j]-y[i]);
}
v=sort_points(v);
int m=v.size();
if(m==0) continue;
ll xs[4020], ys[4020];
xs[0]=ys[0]=0;
for(int j=0; j<2*m; j++){
xs[j+1]=xs[j]+v[j%m].first, ys[j+1]=ys[j]+v[j%m].second;
}
auto comp=[&](int l, int r){
ll z=v[l].first*v[r%m].second-v[l].second*v[r%m].first;
if(z!=0) return z>0;
else if(v[l].first*v[r%m].first+v[l].second*v[r%m].second>0) return l<(r%m);
else return false;
};
int r=1;
for(int l=0; l<m; l++){
r=max(r, l+1);
while(r<l+m && comp(l, r)){
r++;
}
ans+=v[l].first*(ys[r]-ys[l])-v[l].second*(xs[r]-xs[l]);
ans%=MOD;
}
}
cout<<ans*((MOD+1)/3)%MOD<<endl;
return 0;
}
chocorusk