妹子求助 WA on test 8
查看原帖
妹子求助 WA on test 8
108185
Catalan1906AHトリスタ楼主2023/11/23 18:19

感觉 inf 设置的够大了应该不是这个问题吧,但是哪里错了,找不出来(

CF不开放数据下载,太坏了qwq

#include <bits/stdc++.h>
#define ll __int128
using namespace std;
 
inline int read() {
    int tmp = 0, f = 1;
    char c = getchar();
    while(!isdigit(c)) {
        if(c == '-') f = -f;
        c = getchar();
    }
    while(isdigit(c)) tmp = (tmp << 1) + (tmp << 3) + (c ^ 48), c = getchar();
    return tmp * f;
}
 
inline ll readll() {
    ll tmp = 0, f = 1;
    char c = getchar();
    while(!isdigit(c)) {
        if(c == '-') f = -f;
        c = getchar();
    }
    while(isdigit(c)) tmp = (tmp << 1) + (tmp << 3) + (c ^ 48), c = getchar();
    return tmp * f;
}
 
void write(ll x) {
	if(x > 9) write(x / 10);
	putchar((x % 10) ^ 48);
}
 
int a[100010], n;
ll k;
 
inline bool check(ll fz) {
    ll cnt = 0;
    // cerr << fz << " "; 
    for(int i = 1; i <= n; i++) {
        ll l = 0, r = min((ll)a[i], k), res = l;
        while(l <= r) {
            ll mid = (l + r) / 2;
            if(a[i] - mid * mid * 3 + mid * 3 - 1 >= fz) res = mid, l = mid + 1;
            else r = mid - 1;
        }
        // cerr << res << " " ; 
        cnt += res;
    }
    // cerr << endl;
    return cnt >= k;
}
 
int main() {
    n = read(); k = readll();
    for(int i = 1; i <= n; i++) a[i] = read();
    ll l = -1e30, r = 1e30, ans = r;
    while(l <= r) {
        ll mid = (l + r) / 2;
        if(check(mid)) l = mid + 1, ans = mid;
        else r = mid - 1;
    }
    // cerr << ans << endl;
    ll cnt = 0;
    for(int i = 1; i <= n; i++) {
        ll l = -1, r = min((ll)a[i], k), res = l;
        while(l <= r) {
            ll mid = (l + r) / 2;
            if(a[i] - mid * mid * 3 + mid * 3 - 1 >= ans) res = mid, l = mid + 1;
            else r = mid - 1;
        }
        // cerr << res << endl;
        write(min(res, max((ll)0, k - cnt))), putchar(' ');
        cnt += res;
    }
    cout << endl;
    return 0;
}
2023/11/23 18:19
加载中...