QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#304384#7904. Rainbow SubarraySakib_SafwanWA 285ms13512kbC++174.6kb2024-01-13 18:52:242024-01-13 18:52:26

Judging History

你现在查看的是最新测评结果

  • [2024-06-09 00:00:26]
  • hack成功,自动添加数据
  • (/hack/652)
  • [2024-01-13 18:52:26]
  • 评测
  • 测评结果:WA
  • 用时:285ms
  • 内存:13512kb
  • [2024-01-13 18:52:24]
  • 提交

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'