QOJ.ac
QOJ
ID | Submission ID | Problem | Hacker | Owner | Result | Submit time | Judge time |
---|---|---|---|---|---|---|---|
#650 | #277293 | #7904. Rainbow Subarray | chen_zhe_ | Rikkual | Failed. | 2024-06-08 23:57:38 | 2024-06-08 23:57:38 |
Details
Extra Test:
Accepted
time: 1371ms
memory: 211648kb
input:
1 500000 100000000000000 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 99996...
output:
447074
result:
ok single line: '447074'
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#277293 | #7904. Rainbow Subarray | Rikkual | TL | 1764ms | 20156kb | C++14 | 2.6kb | 2023-12-06 17:27:08 | 2024-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
*/