QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#652#277293#7904. Rainbow Subarraychen_zhe_RikkualSuccess!2024-06-09 00:00:122024-06-09 00:00:14

詳細信息

Extra Test:

Time Limit Exceeded

input:

1
500000 10000000000000
1 500000000 2000 500001999 3999 500003998 5998 500005997 7997 500007996 9996 500009995 11995 500011994 13994 500013993 15993 500015992 17992 500017991 19991 500019990 21990 500021989 23989 500023988 25988 500025987 27987 500027986 29986 500029985 31985 500031984 33984 5000339...

output:


result:


ID题目提交者结果用时内存语言文件大小提交时间测评时间
#277293#7904. Rainbow SubarrayRikkualTL 1764ms20156kbC++142.6kb2023-12-06 17:27:082024-06-09 00:01:00

answer

#include<bits/stdc++.h>
#define Heap_PII priority_queue<PII, vector<PII>, greater<PII>>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
#define _rep(i, a, b) for(int i = (a); i >= (b); i--)
#define out(x) cout << ((x) ? "YES" : "NO") << endl
#define mod(x, P) (((x) % (P) + (P)) % (P))
#define ULL unsigned long long
#define PII pair<int, int>
#define PLL pair<LL, LL>
#define lowbit(x) (x & -x)
#define LL long long
#define pb push_back
#define gcd __gcd
#define Big __int128
#define endl "\n"
#define x first
#define y second
#define int LL
using  namespace std;

const int N = 5e5 + 10, M = 1e4 + 10, INF = 1e9, P = 13331;

int n, m;
struct node{
	int l, r;
	int v, sum;
	void init(){
		l = r = v = sum = 0;
	}
}tr[N * 40];
int root, a[N], idx;

void pushup(int u){
	tr[u].v = tr[tr[u].l].v + tr[tr[u].r].v;
	tr[u].sum = tr[tr[u].l].sum + tr[tr[u].r].sum;
}
void modify(int &u, int l, int r, int x, int c){
	if(!u) tr[u = ++idx].init();
	if(l == r) tr[u].v += c, tr[u].sum += l * c;
	else{
		int mid = l + r >> 1;
		if(x <= mid) modify(tr[u].l, l, mid, x, c);
		else modify(tr[u].r, mid + 1, r, x, c);
		pushup(u);
	}
}
int sum(int u, int l, int r, int L, int R){
	if(!u) return 0;
	if(L <= l && r <= R) return tr[u].v;
	int mid = l + r >> 1, ans = 0;
	if(L <= mid) ans += sum(tr[u].l, l, mid, L, R);
	if(R > mid) ans += sum(tr[u].r, mid + 1, r, L, R);
	return ans;
}
int SUM(int u, int l, int r, int L, int R){
	if(!u) return 0;
	if(L <= l && r <= R) return tr[u].sum;
	int mid = l + r >> 1, ans = 0;
	if(L <= mid) ans += SUM(tr[u].l, l, mid, L, R);
	if(R > mid) ans += SUM(tr[u].r, mid + 1, r, L, R);
	return ans;
}
int query(int u, int l, int r, int k){
	if(l == r) return l;
	int mid = l + r >> 1;
	if(tr[tr[u].l].v < k) return query(tr[u].r, mid + 1, r, k - tr[tr[u].l].v);
	return query(tr[u].l, l, mid, k);
}
void solve(){
	cin >> n >> m;
	_for(i, 1, n) cin >> a[i];
	_for(i, 1, n) a[i] += 1e15 - i;
	root = idx = 0;
	
	int L = 1, R = 1, ans = 0;
	while(L <= n){
		while(R <= n){
			modify(root, 0, 2e15, a[R], 1);
			int l = query(root, 0, 2e15, (R - L) / 2 + 1);
			int t = sum(root, 0, 2e15, 0, l) * l - SUM(root, 0, 2e15, 0, l) + SUM(root, 0, 2e15, l, 2e15) - sum(root, 0, 2e15, l, 2e15) * l;
			if(t > m){
				modify(root, 0, 2e15, a[R], -1);
				break;
			}
			R++;
		}
		ans = max(ans, R - L);
		modify(root, 0, 2e15, a[L++], -1);
	}
	cout << ans << endl;
}
signed main(){
	IOS;

	int T = 1;
	cin >> T;
	while(T--){
		solve();
	}
	return 0;
}

/*

1
7 5
7 2 5 5 4 11 7


*/