QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#389628 | #7904. Rainbow Subarray | zxzxzxq | TL | 0ms | 12176kb | C++14 | 3.8kb | 2024-04-14 17:18:36 | 2024-04-14 17:18:37 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1000500;
int n,a[maxn],b[maxn*3],m,sum[maxn],q;
int deleted[maxn];
struct segment_tree{
struct tree{
int val,size;
}t[maxn*3*4];
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define ls i<<1
#define rs i<<1|1
void pushup(int i)
{
t[i].size=t[ls].size+t[rs].size;
t[i].val=t[ls].val+t[rs].val;
}
void rebuild_tree(int i,int l,int r)
{
t[i].size=t[i].val=0;
if(l==r) return ;
int mid=(l+r)/2;
rebuild_tree(lson);
rebuild_tree(rson);
return ;
}
void change_tree(int i,int l,int r,int x,int targetval,int targetsize)
{
if(x<l||x>r) return ;
if(l==r)
{
t[i].size+=targetsize;
t[i].val+=targetval;
return ;
}
int mid=(l+r)/2;
if(x<=mid) change_tree(lson,x,targetval,targetsize);
else change_tree(rson,x,targetval,targetsize);
pushup(i);
}
pair<int,int> ask_sum_tree(int i,int l,int r,int x,int y)
{
if(l>r) return make_pair(0,0);
if(x>y) return make_pair(0,0);
if(l>=x&&r<=y)
{
return make_pair(t[i].val,t[i].size);
}
int mid=(l+r)/2;
pair<int,int> ans1=make_pair(0,0),ans2=make_pair(0,0);
if(x<=mid) ans1=ask_sum_tree(lson,x,y);
if(y>mid) ans2=ask_sum_tree(rson,x,y);
ans1.first+=ans2.first;
ans1.second+=ans2.second;
return ans1;
}
}st;
void solve()
{
scanf("%lld %lld",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i+n]=a[i]-i+1,b[i+n+n]=a[i]-i-1,b[i]=a[i]-i;
sum[i]=sum[i-1]+a[i];
}
sort(b+1,b+3*n+1);
memset(deleted,0,sizeof(int)*(n+20));
m=unique(b+1,b+n*3+1)-b;
st.rebuild_tree(1,1,m);
auto checkvalue= [&](int x,int place)
{
int targetplace=upper_bound(b+1,b+m+1,x-place)-b;
pair<int,int> tmp=st.ask_sum_tree(1,1,m,1,targetplace-1);
int val=-tmp.first+tmp.second*(x-place);
tmp=st.ask_sum_tree(1,1,m,targetplace,m);
val+=tmp.first-tmp.second*(x-place);
return val<=q;
};
auto check = [&](int len)->
int {
for(int i=1;i<=n;i++)
{
if(deleted[i]!=1) continue;
int vp=lower_bound(b+1,b+m+1,a[i]-i)-b;
st.change_tree(1,1,m,vp,-a[i]+i,-1);
deleted[i]=0;
}
for(int i=1;i<=len;i++)
{
int vp=lower_bound(b+1,b+m+1,a[i]-i)-b;
st.change_tree(1,1,m,vp,a[i]-i,1);
deleted[i]=1;
}
if(checkvalue(sum[len]/len,(len)/2+1)) return 1;
if(checkvalue(sum[len]/len,(len)/2)) return 1;
for(int i=len+1;i<=n;i++)
{
int vp=lower_bound(b+1,b+m+1,a[i]-i)-b;
st.change_tree(1,1,m,vp,a[i]-i,1);
vp=lower_bound(b+1,b+m+1,a[i-len]-(i-len))-b;
st.change_tree(1,1,m,vp,-a[i-len]+(i-len),-1);
deleted[i]=1;
deleted[i-len]=0;
if(checkvalue((sum[i]-sum[i-len])/len,i-(len+1)/2+1)) return 1;
if(checkvalue((sum[i]-sum[i-len])/len,i-(len+1)/2)) return 1;
}
return 0;
};
auto getans = [&]()
{
int l=1,r=n,mid,ans=0;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
};
printf("%lld\n",getans());
}
signed main()
{
// ios::sync_with_stdio(false);
int T;
scanf("%lld",&T);
// cin>>T;
while(T--)
{
solve();
}
}
/*
1
6 0
100 3 4 5 99 100
*/
/*
1
5 6
1 1 1 1 1
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 12176kb
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
Time Limit Exceeded
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 6 8 7 7 1 7 6 2 4 3 1 4 7 7 3 4 3 9 3 8 6 6 2 1 6 3 1 2 4 6 4 5 4 1 4 7 1 6 3 5 6 6 1 7 5 3 1 6 3 4 3 2 2 6 2 3 10 1 4 3 2 4 5 1 7 5 5 4 6 5 3 6 2 5 5 8 5 4 5 2 1 5 2 3 3 4 7 1 3 1 2 2 6 3 1 6 8 1 8 4 5 5 6 7 4 8 3 2 8 4 5 5 2 6 2 4 1 5 4 5 3 2 4 1 2 1 4 4 8 3 7 3 3 3...