結果
| 問題 |
No.5008 [Cherry Alpha] Discrete Pendulum with Air Resistance
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-10-03 15:47:56 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,977 ms / 2,000 ms |
| コード長 | 2,995 bytes |
| コンパイル時間 | 4,161 ms |
| 実行使用メモリ | 6,952 KB |
| スコア | 1,463,717,813,330,555 |
| 最終ジャッジ日時 | 2022-10-14 21:38:49 |
| 合計ジャッジ時間 | 106,452 ms |
|
ジャッジサーバーID (参考情報) |
judge8 / judge11 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#pragma GCC target("avx2")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
int getpos(int tim,int b){
int p=tim/b;
int q=tim%b;
int res;
if(p&1){res=b-q;}
else{res=q;}
if(p&2){res*=-1;}
return res;
}
int n,k;
vector<int> t,u;
int sz;
long long eval(vector<int> &cnt,bool debug){
// tairitsu
double t_all=0.0;
for(auto &nx : t){
double t_cur=0.0;
vector<int> xlis(sz+1);
for(int i=1;i<=sz;i++){
xlis[i]=getpos(nx,i);
}
for(int i=1;i<=sz;i++){
for(int j=i;j<=sz;j++){
double del;
if(i==j){del=(cnt[i]*(cnt[i]-1))/2;}
else{del=cnt[i]*cnt[j];}
if(del==0.0){continue;}
del*=abs(xlis[i]-xlis[j]);
del/=((double)(i+j));
t_cur+=del;
}
}
t_cur*=2.0e7;
t_cur/=((double)(n*(n-1)));
t_all+=round(t_cur);
if(debug){cerr << ((int)round(t_cur)) << "\n";}
}
t_all/=((double)k);
if(debug){cerr << "\n";}
// kyoucyou
double k_all=0.0;
for(auto &nx : u){
double k_cur=0.0;
vector<int> xlis;
for(int i=1;i<=sz;i++){
if(cnt[i]>0){xlis.push_back(getpos(nx,i));}
}
sort(xlis.begin(),xlis.end());
k_cur=xlis.back()-xlis[0];
k_cur/=20.0;
k_cur+=1.0;
k_cur=1.0e7/sqrt(k_cur);
k_all+=round(k_cur);
if(debug){cerr << ((int)round(k_cur)) << "\n";}
}
k_all/=((double)k);
if(debug){cerr << "\n";}
long long rt=(t_all+0.5);
long long rk=(k_all+0.5);
if(debug){
cerr << rt << "\n";
cerr << rk << "\n";
cerr << rt*rk << "\n";
}
return rt*rk;
}
long long get_rand(long long lim,mt19937_64 &eg){
return (long long)(eg()%lim);
}
int main(){
std::random_device seed_gen;
std::mt19937_64 engine(seed_gen());
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
t.resize(k);
u.resize(k);
for(auto &nx : t){cin >> nx;}
for(auto &nx : u){cin >> nx;}
sz=15;
vector<int> res(sz+1,0);
for(int i=0;i<n;i++){
res[1+(i%sz)]++;
}
long long maxsc=eval(res,false);
for(int tr=0;tr<140;tr++){
vector<int> cv(sz+1,0);
int bas=2+tr%15;
for(int i=0;i<n;i++){
cv[1+get_rand(bas,engine)]++;
}
long long cursc=eval(cv,false);
for(int i=0;i<360;i++){
int p=1+get_rand(bas,engine);
int q=1+get_rand(bas,engine);
if(p==q){continue;}
bool act=false;
while(cv[p]>0){
cv[p]--;cv[q]++;
long long nexsc=eval(cv,false);
if(cursc<=nexsc){act=true;cursc=nexsc;}
else{cv[p]++;cv[q]--;break;}
}
if(act){continue;}
while(cv[q]>0){
cv[p]++;cv[q]--;
long long nexsc=eval(cv,false);
if(cursc<=nexsc){act=true;cursc=nexsc;}
else{cv[p]--;cv[q]++;break;}
}
}
if(maxsc<=cursc){
maxsc=cursc;
res=cv;
}
}
for(int i=1;i<=sz;i++){
for(int j=0;j<res[i];j++){
cout << i << " " << i << " " << 1 << "\n";
}
}
eval(res,true);
return 0;
}