QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#276910 | #7904. Rainbow Subarray | ucup-team956# | WA | 821ms | 6580kb | C++20 | 2.2kb | 2023-12-06 12:44:47 | 2023-12-06 12:44:48 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct Node {
multiset<int> S ;
int sum = 0 ;
int min() { return *S.begin() ; }
int size() {
return S.size() ;
}
void push(int x) {
sum += x , S.insert(x) ;
}
int erase(int m) {
S.erase(S.find(m)) ;
sum -= m ;
return m ;
}
int pop_max() {
return erase(*prev(S.end())) ;
}
int pop_min() {
return erase(*S.begin()) ;
}
};
int n , K ;
void solve() {
cin >> n >> K ;
vector a(n , 0ll) ;
for (auto &i : a) cin >> i ;
for (int i = 0 ; i < n ; ++ i) {
a[i] -= i ;
}
auto check = [&](int len) -> bool {
Node L , R ;
int sl = 0 , sr = 0 ;
for (int i = 0 ; i < len ; ++ i) {
L.push(a[i]) ;
}
while (L.size() > R.size()) {
R.push(L.pop_max()) ;
} // L <= R
int mid = R.min() ;
int tot = (L.size() * mid - L.sum) + (R.sum - R.size() * mid) ;
if (tot <= K) return 1 ;
for (int i = len ; i < n ; ++ i) {
if (a[i - len] < R.min()) L.erase(a[i - len]) ;
else R.erase(a[i - len]) ;
if (a[i] <= R.min()) L.push(a[i]) ;
else R.push(a[i]) ;
while (L.size() > R.size()) R.push(L.pop_max()) ;
while (R.size() > 1 + L.size()) L.push(R.pop_min()) ;
// cout << i << ' ' << L.sum << ' ' << R.sum << '\n' ;
// cout << L.size() << ' ' << R.size() << '\n' ;
int mid = R.min() ;
int tot = (L.size() * mid - L.sum) + (R.sum - R.size() * mid) ;
if (tot <= K) return 1 ;
}
return 0 ;
};
// for (int i = 4 ; i <= 4 ; ++ i) {
// // cout << i << ' ' << check(i) << '\n' ;
// check(i) ;
// }
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(0) , cout.tie(0) ;
int t;
cin>>t;
while(t--) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3488kb
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: 821ms
memory: 6580kb
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 7 8 7 7 1 7 6 2 4 3 1 6 7 7 3 4 3 9 3 8 6 6 3 1 6 3 1 2 4 6 4 6 4 2 4 7 1 6 3 5 6 6 1 7 5 3 1 6 4 5 3 2 2 6 2 3 10 1 4 3 2 4 5 1 7 5 5 5 8 5 3 6 3 5 5 8 5 4 5 2 1 5 2 3 3 4 8 1 3 1 2 2 8 3 1 6 8 1 8 4 5 6 6 8 4 8 3 2 8 4 5 6 2 6 2 4 1 5 4 5 3 2 4 1 2 1 4 5 8 3 7 3 3 3...
result:
wrong answer 50th lines differ - expected: '1', found: '2'