90pts, 不是这么卡常数吗
  • 板块P10455 Genius Acm
  • 楼主w150432
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/25 10:01
  • 上次更新2025/7/25 10:13:41
查看原帖
90pts, 不是这么卡常数吗
1376172
w150432楼主2025/7/25 10:01
#include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 10;

int t, n, m;
int a[N], s[N];
long long T;

inline int ri() {
    int k = 1, n = 0;
    char c = getchar_unlocked();
    
    while (c < '0' || c > '9') {
        if (c == '-') k = -k;
        c = getchar_unlocked();
    }
    
    while (c >= '0' && c <= '9') {
        n = n * 10 + (c - '0');
        c = getchar_unlocked();
    }
    
    return n * k;
}

inline long long rll() {
    int k = 1;
    long long n = 0;
    char c = getchar_unlocked();
    
    while (c < '0' || c > '9') {
        if (c == '-') k = -k;
        c = getchar_unlocked();
    }
    
    while (c >= '0' && c <= '9') {
        n = n * 10 + (c - '0');
        c = getchar_unlocked();
    }
    
    return n * k;
}

inline void print(int x) {
    if (x < 0) {
        putchar('-');
        x = -x;
    } 
    
    if (x > 9) print(x / 10);
    putchar(x % 10 + '0');
}

inline long long get(int l, int r) {
    int k = 0;
    for (int i = l ; i <= r ; i ++ )
        s[ ++ k] = a[i];
    
    sort(s + 1, s + k + 1);    
    
    long long sum = 0;
    int mid = r - l + 1 >> 1;
	for(int i = 1 ; i <= m && i <= k ; i ++ , k -- ) {
	    int dif = s[i] - s[k];
	    sum += 1ll * dif * dif;
	}
    
    return sum;
}

int main() {
    t = ri();
    
    while (t -- ) {
        n = ri(), m = ri(), T = rll();
        
        for (int i = 1 ; i <= n ; i ++ ) a[i] = ri();
        
        int res = 0, l = 1, r = 1;
        while (r <= n) {
            int p = 1;
            while (p) {
                if (r + p <= n && get(l, r + p) <= T) {
                    r += p;
                    p <<= 1;
                }
                else p >>= 1;
            }
            l = ++ r;
            res ++ ;
        }
        
        print(res);
        putchar('\n');
    }
    
    return 0;
}
2025/7/25 10:01
加载中...