QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#649#277293#7904. Rainbow Subarraychen_zhe_RikkualFailed.2024-06-08 23:56:542024-06-08 23:56:54

详细

Extra Test:

Accepted
time: 1240ms
memory: 210272kb

input:

1
500000 1000000000000000
1 1000000000 2000 999998001 3999 999996002 5998 999994003 7997 999992004 9996 999990005 11995 999988006 13994 999986007 15993 999984008 17992 999982009 19991 999980010 21990 999978011 23989 999976012 25988 999974013 27987 999972014 29986 999970015 31985 999968016 33984 9999...

output:

500000

result:

ok single line: '500000'

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


*/