昨晚ABC E神秘nlogn做法求条或证伪
  • 板块学术版
  • 楼主Infter
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/29 12:18
  • 上次更新2024/9/29 16:49:06
查看原帖
昨晚ABC E神秘nlogn做法求条或证伪
386547
Infter楼主2024/9/29 12:18
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define endl '\n'
#define debug(x) cerr << #x << " = " << x << endl
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (a); i >= (b); i--)
#define gn(u, v) for (int v : G.G[u])
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define pii pair<int, int>
#define vi vector<int>
#define vpii vector<pii>
#define vvi vector<vi>
#define no cout << "NO" << endl
#define yes cout << "YES" << endl
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define tomin(x, y) ((x) = min((x), (y)))
#define tomax(x, y) ((x) = max((x), (y)))
#define pq priority_queue

constexpr int MAXN = 2e5+5;
int n, m, k;
pii a[MAXN];
int res[MAXN];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m >> k;
    // if (n == m) {
    //     for (int i = 1; i <= n; i++)
    //         cout << "0" << " ";
    //     cout << endl;
    //     return 0;
    // }
    for (int i = 1; i <= n; i++)
        cin >> a[i].first, a[i].second = i, k -= a[i].first;
    sort(a + 1, a + n + 1);
    
    int cnt = 0;
    for (int i = n - m + 1; i <= n; i++) {
        if (a[i].first == a[n - m + 1].first) cnt++;
    }

    for (int i = 1; i <= n - m; i++) {
        int t = k, ans = 0;
        t -= a[n - m + 1].first - a[i].first;
        if (t < 0) {
            res[a[i].second] = -1;
            continue;
        }
        ans += a[n - m + 1].first - a[i].first;
        ans += (t + cnt) / (cnt + 1);
        res[a[i].second] = ans;
    }
    int sum = 0;
    for (int i = n - m + 1; i <= n; i++) {
        sum += (a[i].first - a[i - 1].first) * (i - (n - m));
        int t = k, ans = 0;
        t -= sum;
        if (t < 0) continue;
        int tmp = i - (n - m);
        ans += (t + tmp) / (tmp + 1);
        // cerr << tmp << endl;
        res[a[i].second] = ans;
    }

    for (int i = 1; i <= n; i++)
        cout << res[i] << " ";
    cout << endl;


    return 0;

大概思路就是贪心计算每个人前面要多少个人才能把他踢掉。

AC了6个点,WA41个点,过样例

2024/9/29 12:18
加载中...