結果
| 問題 |
No.947 ABC包囲網
|
| コンテスト | |
| ユーザー |
ttttan2
|
| 提出日時 | 2019-12-10 22:42:15 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,538 bytes |
| コンパイル時間 | 3,882 ms |
| コンパイル使用メモリ | 179,392 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-06-24 02:29:10 |
| 合計ジャッジ時間 | 38,167 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 WA * 39 |
ソースコード
#include<bits/stdc++.h>
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<pii,int> ppii;
typedef pair<int,pii> pipi;
typedef pair<ll,ll> pll;
typedef pair<pll,ll> ppll;
typedef pair<ll,pll> plpl;
typedef tuple<ll,ll,ll> tl;
ll mod=1000000007;
ll mod2=998244353;
ll mod3=1000003;
ll mod4=998244853;
ll inf=1000000000;
double pi=2*acos(0);
#define rep(i,m,n) for(ll i=m;i<n;i++)
#define rrep(i,n,m) for(ll i=n;i>=m;i--)
int dh[4]={1,-1,0,0};
int dw[4]={0,0,1,-1};
int ddh[8]={-1,-1,-1,0,0,1,1,1};
int ddw[8]={-1,0,1,-1,1,-1,0,1};
ll lmax(ll a,ll b){
if(a<b)return b;
else return a;
}
ll lmin(ll a,ll b){
if(a<b)return a;
else return b;
}
ll gcd(ll a,ll b){
if(a<b)swap(a,b);
if(b==0)return a;
if(a%b==0)return b;
return gcd(b,a%b);
}
ll Pow(ll n,ll k){
ll ret=1;
ll now=n;
while(k>0){
if(k&1)ret*=now;
now*=now;
k/=2;
}
return ret;
}
ll beki(ll n,ll k,ll md){
ll ret=1;
ll now=n;
while(k>0){
if(k%2==1){
ret*=now;
ret%=md;
}
now*=now;
now%=md;
k/=2;
}
return ret;
}
ll gyaku(ll n,ll md){
return beki(n,md-2,md);
}
bool cmp(pll a,pll b){
if(a.first*b.first<0)return a.first>b.first;
if(a.first==0){
if(b.first==0){
if(a.second==-1)return true;
else return false;
}
if(a.second==1){
if(b.first>0)return false;
else return true;
}
if(a.second==-1){
return true;
}
}
if(b.first==0){
if(b.second==-1)return false;
else{
if(a.first>0)return true;
else return false;
}
}
return a.second*b.first<a.first*b.second;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int n;cin>>n;
//cout<<acos(0.5)*180/pi;return 0;
vector<pll> v[2];
int r[2]={0,0};
map<pll,ll> mp;
rep(i,0,n){
ll a,b;cin>>a>>b;
ll c=gcd(abs(a),abs(b));
if(a==0){
if(b==0)continue;
if(b>0)r[0]++;
else r[1]++;
continue;
}
if(mp[{a/c,b/c}]){mp[{a/c,b/c}]++;continue;}
mp[{a/c,b/c}]=1;
if(a>0)v[0].push_back({a/c,b/c});
else v[1].push_back({a/c,b/c});
}
sort(v[0].begin(),v[0].end(),cmp);
sort(v[1].begin(),v[1].end(),cmp);
vector<pll> w;
if(r[1])w.push_back({0,-1});
rep(i,0,v[0].size())w.push_back(v[0][i]);
if(r[0])w.push_back({0,1});
rep(i,0,v[1].size())w.push_back(v[1][i]);
mp[{0,1}]=r[0];
mp[{0,-1}]=r[1];
ll mae[w.size()];
ll saki[w.size()];
rep(i,0,w.size()){
ll u=i,d=-1;
ll f=-w[i].first,g=-w[i].second;
pll pp={f,g};
if(f<0)pp={0,-1};
while(u-d>1){
ll mid=(u+d)/2;
if(pp==w[mid]){
d=mid;
continue;
}
if(cmp(w[mid],pp))d=mid;
else u=mid;
}
mae[i]=d;
}
rep(i,0,w.size()){
ll u=w.size(),d=i;
ll f=-w[i].first,g=-w[i].second;
pll pp={f,g};
if(f>0)pp={-1,-9999999999999};
while(u-d>1){
ll mid=(u+d)/2;
if(pp==w[mid]){
d=mid;
continue;
}
if(cmp(w[mid],pp))d=mid;
else u=mid;
}
saki[i]=d;
}
rep(i,0,w.size()){
//cout<<saki[i]<<endl;
}//return 0;
rep(i,0,w.size()){
//cout<<w[i].first<<" "<<w[i].second<<" "<<mp[w[i]]<<endl;
}
ll ans=0;
rep(i,0,w.size()){
ll dp[w.size()+1][3];
memset(dp,0,sizeof dp);
dp[i][0]=mp[w[i]];
//ll now=i;
ll sum[w.size()+1][3];
memset(sum,0,sizeof sum);
sum[i+1][0]=dp[i][0];
rep(j,i+1,w.size()){
rep(k,1,3){
dp[j][k]=mp[w[j]]*(sum[j][k-1]-sum[mae[j]+1][k-1]);
sum[j+1][k]=sum[j][k]+dp[j][k];
}
sum[j+1][0]=sum[j][0];
}
ll ee=saki[i];
ee++;
if(ee<w.size()){
pll pp={-w[i].first,-w[i].second};
if(pp==w[ee])ee++;
}
rep(j,ee,w.size()){
ans+=dp[j][2];
}
//cout<<ee<<endl;
/*if(i==1){
rep(j,0,w.size()){
rep(k,0,3)cout<<dp[j][k]<<" ";
cout<<endl;
}
}*/
}
cout<<ans<<endl;
}
ttttan2