QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#544984 | #7904. Rainbow Subarray | CMing | WA | 1482ms | 6952kb | C++14 | 2.9kb | 2024-09-02 21:26:10 | 2024-09-02 21:26:10 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
#define int LL
// #define BOOL
const int N = 5e5 + 5;
int a[N];
#ifdef BOOL
bool solve()
#else
void solve()
#endif
{
int n, k; cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i], a[i] -= i;
auto check = [&](int x) -> bool
{
LL ans = 1e18;
multiset<int> less;
multiset<int, greater<int>> more;
int now = 0;
int last = -1, cntless = 0, cntmore = 0;
for(int i = 1, j = i; j <= n; j++)
{
if(j - i + 1 > x)
{
if(more.find(a[i]) != more.end()) more.erase(more.find(a[i]));
else if(less.find(a[i]) != less.end()) less.erase(less.find(a[i]));
now -= abs(a[i] - last);
i++;
if(more.size() > less.size() + 1)
{
int t = *more.begin();
more.erase(more.begin());
less.insert(t);
}
if(less.size() > more.size())
{
int t = *less.begin();
less.erase(less.begin());
more.insert(t);
}
}
if(more.empty() || a[j] <= *more.begin())
more.insert(a[j]);
else
less.insert(a[j]);
if(more.size() > less.size() + 1)
{
int t = *more.begin();
more.erase(more.begin());
less.insert(t);
}
if(less.size() > more.size())
{
int t = *less.begin();
less.erase(less.begin());
more.insert(t);
}
int mid = *more.begin();
if(last != -1)
{
if(mid > last)
{
now += (mid - last) * cntless;
now -= (mid - last) * cntmore;
}
else if(mid < last)
{
now -= (mid - last) * cntless;
now += (mid - last) * cntmore;
}
}
now += abs(a[j] - mid);
last = mid;
cntless = more.size();
cntmore = less.size();
if(j >= x) ans = min(ans, now);
}
return ans <= k;
};
int l = 1, r = n;
while(l < r)
{
int mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
cout << l << "\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
cin >> t;
while (t--)
{
#ifdef BOOL
if(solve()) cout << "Yes\n";
else cout << "No\n";
#else
solve();
#endif
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3560kb
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: 1482ms
memory: 6952kb
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 2 2 6 5 7 2 4 1 1 1 1 4 1 2 7 8 7 7 1 7 5 2 4 3 1 6 7 7 3 4 3 9 3 8 6 6 1 1 6 2 1 2 4 5 4 6 4 2 4 6 1 6 3 5 6 6 1 7 5 3 1 6 3 5 3 2 2 6 1 3 10 1 4 2 2 4 5 1 7 5 5 5 8 5 3 6 3 5 5 8 5 4 5 2 1 5 1 4 4 4 8 1 4 1 2 2 8 3 1 6 8 1 8 4 5 6 6 7 4 8 3 2 8 4 5 6 2 6 2 4 1 5 4 5 4 2 4 1 2 1 3 4 8 3 6 3 3 4...
result:
wrong answer 3rd lines differ - expected: '3', found: '2'