結果
| 問題 |
No.5020 Averaging
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-21 14:21:29 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 956 ms / 1,000 ms |
| コード長 | 5,687 bytes |
| コンパイル時間 | 5,376 ms |
| コンパイル使用メモリ | 299,732 KB |
| 実行使用メモリ | 6,548 KB |
| スコア | 80,833,148 |
| 最終ジャッジ日時 | 2024-02-25 12:50:44 |
| 合計ジャッジ時間 | 54,534 ms |
|
ジャッジサーバーID (参考情報) |
judge12 / judge15 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#pragma GCC target("avx2")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#include <sys/time.h>
using namespace std;
long long start_time;
void start_clock(){
struct timeval tv;
gettimeofday(&tv, NULL);
start_time=(tv.tv_sec*1000000+tv.tv_usec);
}
long long current_clock(){
struct timeval tv;
gettimeofday(&tv, NULL);
long long current_time=(tv.tv_sec*1000000+tv.tv_usec);
// cout << current_time-start_time << "(us)\n";
return current_time-start_time;
}
unsigned long long xor128(){
static unsigned long long x=123456789,y=362436069,z=521288629,w=88675123;
unsigned long long t;
t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) );
}
using i128=__int128;
using pll=pair<long long,long long>;
i128 det(long long a,long long b,long long c,long long d){
i128 l=a; l*=d;
i128 r=b; r*=c;
return (l-r);
}
vector<pll> convex_hull(vector<pll> P){
// Copyright (c) 2023 0214sh7
// https://github.com/0214sh7/library/
if(P.size()<=2){
return P;
}
vector<pll> H,L,R;
// sort(P.begin(),P.end());
//下半分
for(int i=0;i<P.size();i++){
int j=L.size();
while(j>=2 && det((L[j-1].first-L[j-2].first),(L[j-1].second-L[j-2].second),(P[i].first-L[j-2].first),(P[i].second-L[j-2].second))<=0){
L.pop_back();
j--;
}
L.push_back(P[i]);
}
//上半分
for(int i=P.size()-1;i>=0;i--){
int j=H.size();
while(j>=2 && det((H[j-1].first-H[j-2].first),(H[j-1].second-H[j-2].second),(P[i].first-H[j-2].first),(P[i].second-H[j-2].second))<=0){
H.pop_back();
j--;
}
H.push_back(P[i]);
}
R=L;
for(int i=1;i<H.size()-1;i++){
R.push_back(H[i]);
}
return R;
}
pll f(pll a,pll b){
return {(a.first+b.first)/2,(a.second+b.second)/2};
}
#define target 500000000000000000
bool jud(vector<pll> &P){
int n=P.size();
for(int i=0;i<n;i++){
long long a=P[(i+1)%n].first-P[i].first;
long long b=P[(i+1)%n].second-P[i].second;
long long c=target-P[i].first;
long long d=target-P[i].second;
if(det(a,b,c,d) < 0){
return false;
}
}
return true;
}
void shrink(int tg,vector<pll> &p){
for(int i=0;i<p.size();i++){
p[i]=f(p[i],p[tg]);
}
}
using pi=pair<int,int>;
vector<pi> gensuf(int remhd,vector<pll> p){
int n=p.size();
vector<int> id(n-1);
for(int i=0;i<n-1;i++){
p[i]=p[i+1];
id[i]=i+1;
}
p.pop_back();
vector<pi> res;
vector<pair<pll,int>> ppi;
for(int i=0;i<p.size();i++){
ppi.push_back({p[i],id[i]});
}
sort(ppi.begin(),ppi.end());
for(int i=0;i<p.size();i++){
p[i]=ppi[i].first;
id[i]=ppi[i].second;
}
for(int hd=0;hd<remhd;hd++){
int tg=-1;
i128 gp=1e37;
for(int i=0;i<p.size();i++){
vector<pll> up=p;
shrink(i,up);
vector<pll> htg;
for(int j=0;j<p.size();j++){
if(i==j){continue;}
htg.push_back(up[j]);
}
vector<pll> ch=convex_hull(htg);
if(jud(ch)){
i128 gx=0,gy=0;
for(auto &nx : ch){
gx+=nx.first;
gy+=nx.second;
}
gx/=ch.size();
gy/=ch.size();
i128 gd=(gx-target)*(gx-target)+(gy-target)*(gy-target);
if(gp > gd){
gp=gd;
tg=i;
}
}
}
if(tg==-1){break;}
shrink(tg,p);
res.push_back({0,id[tg]});
for(int i=tg;i<p.size();i++){
p[i]=p[i+1];
id[i]=id[i+1];
}
p.pop_back();
id.pop_back();
}
reverse(res.begin(),res.end());
return res;
}
void simu(vector<pi> &op,vector<pll> &p){
for(auto &nx : op){
p[nx.first]=f(p[nx.first],p[nx.second]);
p[nx.second]=p[nx.first];
}
}
long long eval(vector<pi> &op,vector<pll> p){
simu(op,p);
return max(abs(p[0].first-target),abs(p[0].second-target));
}
int main(){
start_clock();
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<pll> p(n);
for(int i=0;i<n;i++){
long long x,y;
cin >> x >> y;
p[i].first=x;
p[i].second=y;
}
vector<pi> res;
res=gensuf(50,p);
vector<int> ex(n,0);
for(int i=0;i<res.size();i++){
ex[res[i].second]=1;
}
reverse(res.begin(),res.end());
for(int i=1;i<n;i++){
if(ex[i]==0){
res.push_back({0,i});
}
}
while(res.size()<50){
res.push_back(res.back());
}
reverse(res.begin(),res.end());
long long sc=eval(res,p);
for(int att=0;;att++){
if(current_clock()>900000){break;}
for(int i=0;i<20;i++){
for(int j=0;j<n;j++){
for(int k=j+1;k<n;k++){
int pj=res[i].first;
int pk=res[i].second;
res[i].first=j;
res[i].second=k;
long long csc=eval(res,p);
if(sc>=csc){
sc=csc;
}
else{
res[i].first=pj;
res[i].second=pk;
}
}
}
}
for(int i=0;i<15;i++){
for(int j=i+1;j<15;j++){
for(int k=1;k<n;k++){
for(int l=1;l<n;l++){
int pk=res[i].second;
int pl=res[j].second;
res[i].second=k;
res[j].second=l;
long long csc=eval(res,p);
if(sc>=csc){
sc=csc;
}
else{
res[i].second=pk;
res[j].second=pl;
}
}
}
}
}
}
cout << res.size() << "\n";
for(auto &nx : res){
cout << nx.first+1 << " " << nx.second+1 << "\n";
}
simu(res,p);
for(auto &nx : p){
long long ox=nx.first;
long long oy=nx.second;
cout << ox << " " << oy << "\n";
}
return 0;
}