本地能过。
#include <iostream>
#include <algorithm>
namespace Syxqwq {
inline int read() {
register int x = 0, s = 1;
char c = getchar();
while (c > '9' || c < '0') {
if (c == '-') s = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = (x << 1) + (x << 3) + (c - '0');
c = getchar();
}
return x * s;
}
void Write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
inline void write(int x, char c) {
Write(x);
putchar(c);
}
}
using namespace Syxqwq;
using std::sort;
typedef long long ll;
typedef std::pair<ll, ll> pii;
pii a[1010011];
ll sum[1010011];
ll n, c;
int main() {
auto dis = [&](pii x) {
return x.first + std::min(x.second, n - x.second + 1);
};
int T = read();
while (T--) {
n = read(), c = read();
for (int i = 1; i <= n; ++i) a[i].first = read(), a[i].second = i;
sort(a + 1, a + 1 + n, [&](pii x, pii y) {
return dis(x) < dis(y);
});
int ans = 0;
sum[0] = 0;
for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + dis(a[i]);
for (int i = 1; i <= n; ++i) {
auto pls = std::upper_bound(sum + 1, sum + 1 + n, c - a[i].first - a[i].second);
if (pls - sum >= i) {
auto _ = std::upper_bound(sum + 1, sum + 1 + n, c - a[i].first - a[i].second + dis(a[i]));
ans = std::max(_ - sum, ans);
} else {
ans = std::max(ans, pls - sum + 1);
}
}
write(ans, '\n');
}
return 0;
}
```
