https://cdn.luogu.com.cn/upload/image_hosting/6z3c45d5.png
最大应该不超过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;
}