QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#304384 | #7904. Rainbow Subarray | Sakib_Safwan | WA | 285ms | 13512kb | C++17 | 4.6kb | 2024-01-13 18:52:24 | 2024-01-13 18:52:26 |
Judging History
answer
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef long double ld;
//typedef long long int;
#define endl "\n"
#define ff first
#define ss second
#define all(a) a.begin(), a.end()
#define pb push_back
#define mp make_pair
#define int long long
//const int INF = 1e9;
//const int MOD = 1e9 + 7;
//const ld EPS = 1e-18;
//const ld PI = acos(-1.0);
// typedef long long ll;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
struct ordered_multiset { // multiset supporting duplicating values in set
ll len = 0;
const ll ADD = 1000010;
const ll MAXVAL = 1000000010;
unordered_map<ll, ll> mp; // hash = 96814
tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> T;
ordered_multiset() { len = 0; T.clear(), mp.clear(); }
inline void insert(ll x){
len++, x += MAXVAL;
ll c = mp[x]++;
T.insert((x * ADD) + c); }
inline void erase(ll x){
x += MAXVAL;
ll c = mp[x];
if(c) {
c--, mp[x]--, len--;
T.erase((x*ADD) + c); } }
inline ll kth(ll k){ // 1-based index, returns the
if(k<1 || k>len) return -1; // K'th element in the treap,
auto it = T.find_by_order(--k); // -1 if none exists
return ((*it)/ADD) - MAXVAL; }
inline ll lower_bound(ll x){ // Count of value <x in treap
x += MAXVAL;
ll c = 0;
return (T.order_of_key((x*ADD)+c)); }
inline ll upper_bound(ll x){ // Count of value <=x in treap
x += MAXVAL;
ll c = mp[x];
return (T.order_of_key((x*ADD)+c)); }
inline ll size() { return len; } // Number of elements in treap
};
const int N = 5e5 + 9;
int a , b , med , ans , rptr;
vector<int> v(N);
void ins(ordered_multiset &os, int l){
int sze = rptr - l + 2;
int kh = sze / 2 + 1;
// cout << a << ' ' << med << ' ' << b << ' ' << v[rptr + 1] << ' ' << kh << ' '<< sze << " X ";
if(sze & 1){
if(v[rptr + 1] < med){
b += med;
os.insert(v[rptr + 1]);
med = os.kth(kh);
a += v[rptr + 1];
a -= med;
}
else{
b += v[rptr + 1];
os.insert(v[rptr + 1]);
}
}
else{
if(v[rptr + 1] <= med){
a += v[rptr + 1];
os.insert(v[rptr + 1]);
}
else{
a += med;
os.insert(v[rptr + 1]);
med = os.kth(kh);
b += v[rptr + 1];
b -= med;
}
}
// cout << a << ' ' << med << ' ' << b << " Z ";
}
void del(ordered_multiset &os, int l, int ind){
int sze = rptr - l + 1;
int kh = sze / 2 + 1;
int ele = v[ind];
os.erase(ele);
if(sze & 1){
if(ele < med){
a -= ele;
}
else if(ele > med){
b -= ele;
b += med;
med = os.kth(kh);
a -= med;
}
else{
med = os.kth(kh);
a -= med;
}
}
else{
if(ele >= med){
b -= ele;
os.erase(ele);
}
else if(ele < med){
a -= ele;
a += med;
med = os.kth(kh);
b -= med;
}
else{
med = os.kth(kh);
b -= med;
}
}
}
int cost(int l , int rx){
int sze = rx - l + 1;
int ad = b - a;
if(!(sze & 1)) ad += med;
return ad;
}
void GG()
{
int n , k;
cin >> n >> k;
// vector<int> v(n);
for(int i = 0; i < n; i++){
cin >> v[i];
v[i] -= i;
}
// for(int x = 0; x < n; x++){
// cout << v[x] << ' ';
// }
// cout << endl;
int lptr = 0;
rptr = 0;
med = v[0];
a = 0;
b = 0;
ans = 1;
ordered_multiset os;
os.insert(med);
for(int i = 0; i < n; i++){
// cout << i << ' ' << rptr << ' ' << cost(i , rptr) << ' ';
// cout << a << ' ' << med << ' ' << b << endl;
// rptr = max(rptr , i);
if(cost(i , rptr) > k){
del(os , i + 1 , i);
continue;
}
while(rptr < n - 1){
ins(os , i);
// cout << i << ' ' << rptr + 1 << ' ' << cost(i , rptr + 1) << ' ';
// cout << a << ' ' << med << ' ' << b << ' ';
if(cost(i , rptr + 1) <= k){
rptr++;
ans = max(ans , rptr - i + 1);
// cout << "Y" << endl;
}
else {
del(os , i , rptr + 1);
// cout << "N\n";
break;
}
}
if(rptr > i) del(os , i + 1 , i);
else{
ins(os , i);
rptr++;
// cout << a << ' ' << med << ' ' << b << " XZ ";
del(os , i + 1 , i);
// cout << a << ' ' << med << ' ' << b << endl;
}
}
cout << ans << endl;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int ttc=1;
cin>>ttc;
//int cnt=0;
while(ttc--)
{
//cout<<"Case "<<++cnt<<": ";
GG();
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 6836kb
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: 285ms
memory: 13512kb
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 3 7 7 3 4 3 9 3 8 6 6 3 1 6 3 1 2 4 6 4 6 4 1 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 4 8 3 7 3 3 3...
result:
wrong answer 28th lines differ - expected: '6', found: '3'