QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#644123 | #7904. Rainbow Subarray | 666ldc | WA | 772ms | 6608kb | C++17 | 3.2kb | 2024-10-16 11:05:33 | 2024-10-16 11:05:34 |
Judging History
answer
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define int long long
#define endl '\n'
using i128 = __int128;
using i64 = long long;
using f128 = long double;
using u64 = unsigned long long;
using pii = pair<int, int>;
const int INF = 0x3f3f3f3f, mod = 1e9 + 7;
const i64 inf = 2e18;
//-------------------------------------------
struct st_tree
{
int n;
vector<int> p;
st_tree(int _n) : p(_n + 1), n(_n) {};
void init(int _n)
{
for (int i = 1; i <= n; i++)
p[i] = 0;
n = _n;
}
int lowbit(int x)
{
return x & -x;
}
void add(int u, int d)
{
while (u <= n)
p[u] += d, u += lowbit(u);
}
int find(int u)
{
int sum = 0;
while (u > 0)
{
sum += p[u], u -= lowbit(u);
}
return sum;
}
};
void solve()
{
int n, k;
cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
a[i] = a[i] - i;
}
int num = *min_element(a.begin(), a.end());
vector<int> hx;
if (num <= 0)
{
num = abs(num);
for (int i = 1; i <= n; i++)
{
a[i] += num + 1;
}
}
hx.push_back(-1);
for (int i = 1; i <= n; i++)
{
hx.push_back(a[i]);
}
sort(hx.begin(), hx.end());
hx.erase(unique(hx.begin(), hx.end()), hx.end());
auto find = [&](int num)
{
return lower_bound(hx.begin(), hx.end(), num) - hx.begin();
};
int m = hx.size() - 1;
st_tree stt(m), cnt(m);
auto cal = [&](int x, int mid)
{
int id = find(x);
int sum = 0;
sum += cnt.find(id - 1) * mid - stt.find(id - 1);
sum += (stt.find(m) - stt.find(id - 1)) - (cnt.find(m) - cnt.find(id - 1)) * mid;
return sum;
};
auto check = [&](int x)
{
int sum = 0;
stt.init(m);
cnt.init(m);
// cerr << x << endl;
for (int r = 1; r <= n; r++)
{
int id = find(a[r]);
sum += a[r];
stt.add(id, a[r]);
cnt.add(id, 1);
if (r >= x)
{
int midl = sum / x, midr = sum / x + 1;
int w = min(cal(midl, midl), cal(midr, midr));
// cerr << w << " " << r << endl;
if (w <= k)
return true;
int idl = find(a[r - x + 1]);
sum -= a[r - x + 1];
stt.add(idl, -a[r - x + 1]);
cnt.add(idl, -1);
}
}
return false;
};
int l = 1, r = n;
check(2);
while (r > l)
{
int mid = l + r + 1 >> 1;
if (check(mid))
l = mid;
else
r = mid - 1;
}
cout << l << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T = 1;
cin >> T;
for (int i = 1; i <= T; i++)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3800kb
input:
5 7 5 7 2 5 5 4 11 7 6 0 100 3 4 5 99 100 5 6 1 1 1 1 1 5 50 100 200 300 400 500 1 100 3
output:
4 3 5 1 1
result:
ok 5 lines
Test #2:
score: -100
Wrong Answer
time: 772ms
memory: 6608kb
input:
11102 2 167959139 336470888 134074578 5 642802746 273386884 79721198 396628655 3722503 471207868 6 202647942 268792718 46761498 443917727 16843338 125908043 191952768 2 717268783 150414369 193319712 6 519096230 356168102 262263554 174936674 407246545 274667941 279198849 9 527268921 421436316 3613460...
output:
1 4 3 2 6 5 7 2 4 1 4 1 1 3 2 2 6 8 7 7 1 7 6 2 4 3 1 4 7 7 3 4 3 9 3 8 6 6 2 1 6 3 1 2 4 6 4 5 4 1 4 7 1 6 3 5 6 6 1 7 5 3 1 6 3 4 3 2 2 6 2 3 10 1 4 3 2 4 5 1 7 5 5 4 6 5 3 6 2 5 5 8 5 4 5 2 1 5 2 3 3 4 7 1 3 1 2 2 6 3 1 6 8 1 8 4 5 5 6 7 4 8 3 2 8 4 5 5 2 6 2 4 1 5 4 5 3 2 4 1 2 1 4 4 8 3 7 3 3 3...
result:
wrong answer 17th lines differ - expected: '7', found: '6'