Submission #959533

#TimeUsernameProblemLanguageResultExecution timeMemory
959533Trisanu_DasKoala Game (APIO17_koala)C++17
91 / 100
48 ms756 KiB
#include "koala.h" #include<bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; using pii = pair<int, int>; using pll = pair<ll, ll>; using pld = pair<ld, ld>; #define fi first #define se second #define left BAO #define right ANH #define pb push_back #define pf push_front #define mp make_pair #define ins insert #define btpc __builtin_popcount #define btclz __builtin_clz #define sz(x) (int)(x.size()); #define all(x) x.begin(), x.end() #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] " mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1}; int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1}; int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1}; template<class X, class Y> bool minimize(X &x, const Y &y) { if (x > y) { x = y; return true; } return false; } template<class X, class Y> bool maximize(X &x, const Y &y) { if (x < y) { x = y; return true; } return false; } const int MOD = 1e9 + 7; template<class X, class Y> void add(X &x, const Y &y) { x = (x + y); if(x >= MOD) x -= MOD; } template<class X, class Y> void sub(X &x, const Y &y) { x = (x - y); if(x < 0) x += MOD; } const ll INF = 1e9; const int N = 1e5 + 10; int minValue(int N, int W) { int n = N, w = W; int b[100], r[100]; for(int i = 0; i < n; i++) b[i] = 0; b[0] = 1; int ans = 0; playRound(b, r); for(int i = 1; i < n; i++) { if(r[i] == 0) ans = i; } return ans; } int maxValue(int N, int W) { int n = N, w = W; int b[100], r[100]; for(int i = 0; i < n; i++) b[i] = 1; playRound(b, r); vector<int> nxt; for(int i = 0; i < n; i++) if(r[i] == 2) nxt.pb(i); for(int i = 0; i < n; i++) b[i] = 0; for(auto x : nxt) b[x] = 2; playRound(b, r); nxt.clear(); for(int i = 0; i < n; i++) if(r[i] == 3) nxt.pb(i); for(int i = 0; i < n; i++) b[i] = 0; for(auto x : nxt) b[x] = 4; playRound(b, r); nxt.clear(); for(int i = 0; i < n; i++) if(r[i] == 5) nxt.pb(i); for(int i = 0; i < n; i++) b[i] = 0; for(auto x : nxt) b[x] = 11; playRound(b, r); int ans = 0; for(int i = 0; i < n; i++) if(r[i] == 12) ans = i; return ans; } int greaterValue(int N, int W) { int lo = 1, hi = 9; int n = N, w = W; int b[100], r[100]; while(lo <= hi) { int mid = (lo + hi) >> 1; for(int i = 0; i < n; i++) b[i] = 0; b[0] = b[1] = mid; playRound(b, r); if(r[0] != r[1]) { return (r[0] > r[1] ? 0 : 1); } if(r[0] > b[0]) { lo = mid + 1; } else hi = mid - 1; } return 0; } int n, w; int coef; bool compare(int x, int y) { int lo = 1, hi = 15; int b[100], r[100]; while(lo <= hi) { int mid = (lo + hi) >> 1; for(int i = 0; i < n; i++) b[i] = 0; b[x] = b[y] = mid; if(coef == 2) { for(int i = 0; i < n; i++) { b[i] = 2 * (b[i] + 1) - 1; } } playRound(b, r); if(r[x] != r[y]) { return (r[x] > r[y] ? true : false); } if(r[x] > b[x]) { lo = mid + 1; } else hi = mid - 1; } return true; } vector<int> solve(vector<int> p) { if(p.size() > 3) { int b[100], r[100]; for(int i = 0; i < n; i++) b[i] = 0; int t = 2 * (n - p.size()) / p.size() - 1; while(t * p.size() > n) t--; for(auto x : p) b[x] = t; playRound(b, r); vector<int> left, right; for(auto x : p) if(r[x] > b[x]) right.pb(x); else left.pb(x); if(left.size() && right.size()) { left = solve(left); right = solve(right); for(auto x : right) left.pb(x); return left; } } shuffle(all(p), rng); vector<int> ans; ans.pb(p[0]); for(int i = 1; i < p.size(); i++) { int l = 0, r = ans.size() - 1, pos = -1; while(l <= r) { int mid = (l + r) >> 1; if(compare(p[i], ans[mid])) { pos = mid; l = mid + 1; } else r = mid - 1; } ans.pb(0); for(int i = ans.size() - 1; i > pos + 1; i--) ans[i] = ans[i - 1]; ans[pos + 1] = p[i]; } return ans; } void allValues(int N, int W, int *P) { if (W == 2*N) { n = N, w = W; coef = 2; vector<int> ans; ans.pb(0); for(int i = 1; i < n; i++) { int l = 0, r = ans.size() - 1, pos = -1; while(l <= r) { int mid = (l + r) >> 1; if(compare(i, ans[mid])) { pos = mid; l = mid + 1; } else r = mid - 1; } ans.pb(0); for(int i = ans.size() - 1; i > pos + 1; i--) ans[i] = ans[i - 1]; ans[pos + 1] = i; } for(int i = 0; i < n; i++) { P[ans[i]] = i + 1; } } else { coef = 1; n = N, w = W; int b[100], r[100]; for(int i = 0; i < n; i++) b[i] = 1; playRound(b, r); vector<int> left, right; for(int i = 0; i < n; i++) { if(r[i] <= b[i]) left.pb(i); else right.pb(i); } vector<int> l1, l2; for(int i = 0; i < n; i++) b[i] = 0; for(auto x : left) b[x] = 1; playRound(b, r); for(auto x : left) if(r[x] > b[x]) l2.pb(x); else l1.pb(x); l1 = solve(l1); l2 = solve(l2); right = solve(right); vector<int> ans = l1; for(auto x : l2) ans.pb(x); for(auto x : right) ans.pb(x); for(int i = 0; i < n; i++) { P[ans[i]] = i + 1; } } }

Compilation message (stderr)

koala.cpp: In function 'int minValue(int, int)':
koala.cpp:72:16: warning: unused variable 'w' [-Wunused-variable]
   72 |     int n = N, w = W;
      |                ^
koala.cpp: In function 'int maxValue(int, int)':
koala.cpp:85:16: warning: unused variable 'w' [-Wunused-variable]
   85 |     int n = N, w = W;
      |                ^
koala.cpp: In function 'int greaterValue(int, int)':
koala.cpp:111:16: warning: unused variable 'w' [-Wunused-variable]
  111 |     int n = N, w = W;
      |                ^
koala.cpp: In function 'std::vector<int> solve(std::vector<int>)':
koala.cpp:160:28: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  160 |         while(t * p.size() > n) t--;
      |               ~~~~~~~~~~~~~^~~
koala.cpp:175:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  175 |     for(int i = 1; i < p.size(); i++) {
      |                    ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...