Submission #624569

#TimeUsernameProblemLanguageResultExecution timeMemory
624569QwertyPiLet's Win the Election (JOI22_ho_t3)C++14
23 / 100
2567 ms18740 KiB
#include <bits/stdc++.h> #define int long long #define inf (1 << 30) #define ld long double using namespace std; const int N = 113; int a[N], b[N], s[N]; int id_x[N], id_y[N]; int vid_x[N], vid_y[N]; struct Pair{ int a, b, id; Pair() = default; Pair(int _a, int _b, int _i) : a(_a), b(_b), id(_i){}; }; vector<Pair> vp; long double dp[N][N][N]; int cnt[N][N]; int n, K; long double f(int l){ for(int i = 0; i < n; i++){ s[i + 1] = s[i] + a[id_x[i]]; } long double ans = inf; for(int l = 0; l <= n; l++){ for(int i = 0; i <= n; i++){ for(int j = 0; j <= n; j++){ for(int k = 0; k <= n; k++){ dp[i][j][k] = inf; } } } dp[0][0][0] = 0; for(int i = 0; i <= n; i++){ for(int j = 0; j <= n; j++){ for(int k = 0; k <= n; k++){ if(i > 0){ if(vid_y[id_x[i - 1]] < j){ dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k] - (ld) a[id_x[i - 1]] / (l + 1)); }else{ dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k]); } } if(j > 0){ if(vid_x[id_y[j - 1]] < i){ dp[i][j][k] = min(dp[i][j][k], dp[i][j - 1][k]); }else{ if(k > 0 && b[id_y[j - 1]] != inf){ dp[i][j][k] = min(dp[i][j][k], dp[i][j - 1][k - 1] + (ld) b[id_y[j - 1]] / k); } } } } if(i + j - cnt[i][j] == K){ ans = min(ans, dp[i][j][l] + (ld) s[i] / (l + 1)); } } } } return ans; } int32_t main(){ cin >> n >> K; for(int i = 0; i < n; i++){ cin >> a[i] >> b[i]; b[i] = (b[i] == -1) ? inf : b[i]; vp.push_back({a[i], b[i], i}); } sort(vp.begin(), vp.end(), [](Pair x, Pair y){ return x.a < y.a || x.a == y.a && x.b < y.b; }); for(int i = 0; i < n; i++){ id_x[i] = vp[i].id; vid_x[vp[i].id] = i; } sort(vp.begin(), vp.end(), [](Pair x, Pair y){ return x.b < y.b || x.b == y.b && x.a < y.a; }); for(int i = 0; i < n; i++){ id_y[i] = vp[i].id; vid_y[vp[i].id] = i; } /* for(int i = 0; i < n; i++){ cout << vid_x[i] << ' ' << vid_y[i] << ' ' << id_x[i] << ' ' << id_y[i] << endl; } */ for(int i = 0; i < n; i++){ cnt[vid_x[i] + 1][vid_y[i] + 1] = 1; } /* for(int i = 0; i <= n; i++){ for(int j = 0; j <= n; j++){ cout << cnt[i][j] << ' '; } cout << endl; } cout << endl; */ for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ cnt[i][j] = cnt[i - 1][j] + cnt[i][j - 1] + cnt[i][j] - cnt[i - 1][j - 1]; } } int lb = 0, rb = K; while(rb - lb > 1){ int m = (rb + lb) / 2; ld f1 = f(m), f2 = f(m + 1); if(f1 > f2){ rb = m + 1; }else{ lb = m; } } ld ans = min(f(lb), f(rb)); cout << fixed << setprecision(15) << ans << endl; }

Compilation message (stderr)

Main.cpp: In lambda function:
Main.cpp:76:34: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   76 |   return x.a < y.a || x.a == y.a && x.b < y.b;
      |                       ~~~~~~~~~~~^~~~~~~~~~~~
Main.cpp: In lambda function:
Main.cpp:85:34: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   85 |   return x.b < y.b || x.b == y.b && x.a < y.a;
      |                       ~~~~~~~~~~~^~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...