제출 #1201078

#제출 시각아이디문제언어결과실행 시간메모리
1201078vincentbucourt1Let's Win the Election (JOI22_ho_t3)C++20
10 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
void fastIO(){ios_base::sync_with_stdio(false),cin.tie(0);}
#define int long long
#define ld long double

const int INF = (int)1e18;

int N, K;
struct Val{int vote, colab;};
bool cmpVal (const Val& a, const Val& b) {
    if (a.colab == -1) return false;
    else if (b.colab == -1) return true;
    else return tie(a.colab, a.vote) < tie(b.colab, b.vote);
}
vector<Val> vals;
ld ans = (ld)INF;

struct Segtree {
    int numleaves;
    vector<int> numVals, sumVals;
    Segtree (int n) {
        numleaves = 1;
        while (numleaves < n) numleaves *= 2;
        numVals.assign(2*numleaves, 0);
        sumVals.assign(2*numleaves, 0);
    }
    int query (int x) {
        int node = 1;
        int numBef = 0, sumBef = 0;
        while (numleaves > node) {
            if (numBef + numVals[2*node] >= x) {
                node = 2*node;
            }
            else {
                numBef += numVals[2*node];
                sumBef += sumVals[2*node];
                node = 2*node+1;
            }
        }
        sumBef += (x-numBef)*(node-numleaves);
        return sumBef;
    }
    void update (int idx, int sign) {
        idx += numleaves;
        numVals[idx] += sign;
        sumVals[idx] += sign*(idx-numleaves);
        idx /= 2;
        while (idx > 0) {
            numVals[idx] = numVals[2*idx] + numVals[2*idx+1];
            sumVals[idx] = sumVals[2*idx] + sumVals[2*idx+1];
            idx /= 2;
        }
    }
};

signed main() {
    fastIO();
    cin >> N >> K;
    vals.resize(N);
    Segtree sumQ(1020);
    for (int i = 0; i < N; i++) {
        cin >> vals[i].vote >> vals[i].colab;
        sumQ.update(vals[i].vote, 1);
    }
    sort(vals.begin(), vals.end(), cmpVal);
    // for (int i = 0; i < (int)vals.size(); i++) cerr << vals[i].colab << " ";
    // cerr << "\n";
    ld sumColab = 0;
    ans = min(ans, (ld)sumQ.query(K));
    for (int i = 0; i < K && vals[i].colab != -1; i++) {
        sumColab += ((ld)vals[i].colab) / ((ld)(i + 1));
        sumQ.update(vals[i].vote, -1);
        ld sumVote = ((ld)sumQ.query(K-i-1)) / ((ld)(i + 2));
        ans = min(ans, sumColab + sumVote);
    }
    cout << fixed << setprecision(12) << ans << "\n";
}
#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...