求助传智杯D题
  • 板块灌水区
  • 楼主伞兵二号zja
  • 当前回复24
  • 已保存回复24
  • 发布时间2022/3/13 09:50
  • 上次更新2023/10/28 06:42:45
查看原帖
求助传智杯D题
443682
伞兵二号zja楼主2022/3/13 09:50

这题

https://cdn.luogu.com.cn/upload/image_hosting/6z3c45d5.png

最大应该不超过10(5+6+6)10^{(5 + 6 + 6)},但为什么我第一次用longlong交 过14个点 换int128,过18个点呢。

怎么改才能过呢?

#include <bits/stdc++.h>
#define int __int128
using namespace std;

const int M = 2e5 + 10;

int n, k;
int a[M], sum[M];

inline int read() {
    char ch = getchar();
    int x = 0, f = 1;
    while((ch > '9' || ch < '0') && ch != '-') {
        ch = getchar();
    }
    if(ch == '-') { ch = getchar(); f = - 1; }
    while(ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

inline void Write (int s)
{
    int k = 0, len = 0;
    if(s == 0) putchar('0');
    while(s) {
        k = k * 10 + s % 10;
        s /= 10, len++;
    }
    for(int i = 0; i < len; i++){
        putchar(k % 10 + '0');
        k /= 10;
    }
}

bool check(int m) {
    int cnt = 0, pos = 0;
    for(int i = 0; i < n; ++i) {
        if(sum[i + 1] - sum[pos] > m) {
            pos = i; cnt ++;
            if(cnt == k - 1) {
                if(sum[n] - sum[pos] > m) return false;
                else return true;
            }
        }
    }
    if(cnt < k) return true;
    else return false;
}

signed main() {
    n = read(); k = read();
    for(int i = 1; i <= n; ++i) {
        a[i] = read();
        sum[i] = sum[i - 1] + a[i] * a[i];
    }
    int l = 0, r = sum[n] + 10;
    while(l < r) {
        int mid = (l + r) >> 1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    Write(l);
    cout << '\n';
    return 0;
}
2022/3/13 09:50
加载中...