結果
問題 | No.5020 Averaging |
ユーザー |
👑 ![]() |
提出日時 | 2024-02-25 15:37:41 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 882 ms / 1,000 ms |
コード長 | 5,887 bytes |
コンパイル時間 | 1,549 ms |
コンパイル使用メモリ | 123,836 KB |
実行使用メモリ | 6,676 KB |
スコア | 13,942,552 |
最終ジャッジ日時 | 2024-02-25 15:38:29 |
合計ジャッジ時間 | 47,284 ms |
ジャッジサーバーID (参考情報) |
judge10 / judge14 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#ifdef NACHIA// #define _GLIBCXX_DEBUG#else#define NDEBUG#endif#include <iostream>#include <string>#include <vector>#include <algorithm>#include <utility>#include <queue>#include <array>#include <cmath>using i64 = long long;using u64 = unsigned long long;#define rep(i,n) for(i64 i=0; i<(i64)(n); i++)#define repr(i,n) for(i64 i=(i64)(n)-1; i>=0; i--)const i64 INF = 1001001001001001001;const char* yn(bool x){ return x ? "Yes" : "No"; }template<typename A> void chmin(A& l, const A& r){ if(r < l) l = r; }template<typename A> void chmax(A& l, const A& r){ if(l < r) l = r; }template<typename A> using nega_queue = std::priority_queue<A,std::vector<A>,std::greater<A>>;using namespace std;const i64 TARGET_INT = 500'000'000'000'000'000;#include <unordered_map>#include <cassert>#include <cstdint>namespace nachia{class Xoshiro256pp{public:using i32 = int32_t;using u32 = uint32_t;using i64 = int64_t;using u64 = uint64_t;private:uint64_t s[4];// https://prng.di.unimi.it/xoshiro256plusplus.cstatic inline uint64_t rotl(const uint64_t x, int k) noexcept {return (x << k) | (x >> (64 - k));}inline uint64_t gen(void) noexcept {const uint64_t result = rotl(s[0] + s[3], 23) + s[0];const uint64_t t = s[1] << 17;s[2] ^= s[0];s[3] ^= s[1];s[1] ^= s[2];s[0] ^= s[3];s[2] ^= t;s[3] = rotl(s[3], 45);return result;}// https://xoshiro.di.unimi.it/splitmix64.cu64 splitmix64(u64& x) {u64 z = (x += 0x9e3779b97f4a7c15);z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;z = (z ^ (z >> 27)) * 0x94d049bb133111eb;return z ^ (z >> 31);}public:void seed(u64 x = 7001){assert(x != 0);s[0] = x;for(int i=1; i<4; i++) s[i] = splitmix64(x);}Xoshiro256pp(){ seed(); }u64 rng64() { return gen(); }u64 operator()(){ return gen(); }// generate x : l <= x <= ru64 random_unsigned(u64 l,u64 r){assert(l<=r);r-=l;auto res = rng64();if(res<=r) return res+l;u64 d = r+1;u64 max_valid = 0xffffffffffffffff/d*d;while(true){auto res = rng64();if(res<=max_valid) break;}return res%d+l;}// generate x : l <= x <= ri64 random_signed(i64 l,i64 r){assert(l<=r);u64 unsigned_l = (u64)l ^ (1ull<<63);u64 unsigned_r = (u64)r ^ (1ull<<63);u64 unsigned_res = random_unsigned(unsigned_l,unsigned_r) ^ (1ull<<63);return (i64)unsigned_res;}// permute x : n_left <= x <= n_right// output r from the fronttemplate<class Int>std::vector<Int> random_nPr(Int n_left, Int n_right, Int r){Int n = n_right-n_left;assert(n>=0);assert(r<=(1ll<<27));if(r==0) return {};assert(n>=r-1);std::vector<Int> V;std::unordered_map<Int,Int> G;for(int i=0; i<r; i++){Int p = random_signed(i,n);Int x = p - G[p];V.push_back(x);G[p] = p - (i - G[i]);}for(Int& v : V) v+=n_left;return V;}// V[i] := V[perm[i]]// using swaptemplate<class E,class PermInt_t>void permute_inplace(std::vector<E>& V,std::vector<PermInt_t> perm){assert(V.size() == perm.size());int N=V.size();for(int i=0; i<N; i++){int p=i;while(perm[p]!=i){assert(0 <= perm[p] && perm[p] < N);assert(perm[p] != perm[perm[p]]);std::swap(V[p],V[perm[p]]);int pbuf = perm[p]; perm[p] = p; p = pbuf;}perm[p] = p;}}template<class E>std::vector<E> shuffle(const std::vector<E>& V){int N=V.size();auto P = random_nPr(0,N-1,N);std::vector<E> res;res.reserve(N);for(int i=0; i<N; i++) res.push_back(V[P[i]]);return res;}// shuffle using swaptemplate<class E>void shuffle_inplace(std::vector<E>& V){int N=V.size();permute_inplace(V,random_nPr(0,N-1,N));}};} // namespace nachia#include <random>#include <chrono>nachia::Xoshiro256pp rng;namespace RngInitInstance { struct RngInit { RngInit(){unsigned long long seed1 = std::random_device()();unsigned long long seed2 = std::chrono::high_resolution_clock::now().time_since_epoch().count();rng.seed(seed1 ^ seed2);} } a; }int main(){ios::sync_with_stdio(false); cin.tie(nullptr);int N; cin >> N;vector<i64> A(N), B(N);rep(i,N) cin >> A[i] >> B[i];vector<int> perm(131072);i64 minWeight = INF;vector<int> minWeightPerm(N);rep(i,N) minWeightPerm[i] = i;vector<int> Q = minWeightPerm;auto evalQ = [&]() -> i64 {i64 a = A[Q[0]];i64 b = B[Q[0]];for(int i=1; i<N; i++){a = (a + A[Q[i]]) / 2;b = (b + B[Q[i]]) / 2;}i64 ad = abs(a - TARGET_INT);i64 bd = abs(a - TARGET_INT);i64 w = max(ad, bd) + ad + bd;if(w < minWeight){copy(Q.begin(), Q.end(), minWeightPerm.begin());minWeight = w;}return w;};evalQ();rep(t,30000){for(int i=1; i<N; i++){int j = ((rng.rng64() >> 32) * i) >> 32;swap(Q[j], Q[i]);}i64 w = evalQ();rep(ss,10) for(int i=1; i<N; i++){swap(Q[i], Q[i-1]);i64 nw = evalQ();if(w < nw) swap(Q[i], Q[i-1]); else w = nw;}}Q = minWeightPerm;cout << (N-1) << '\n';repr(i,N-1){cout << (Q[i]+1) << ' ' << (Q[i+1]+1) << '\n';}return 0;}