QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#389628#7904. Rainbow SubarrayzxzxzxqTL 0ms12176kbC++143.8kb2024-04-14 17:18:362024-04-14 17:18:37

Judging History

This is the latest submission verdict.

  • [2024-06-09 00:00:26]
  • hack成功,自动添加数据
  • (/hack/652)
  • [2024-04-14 17:18:37]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 12176kb
  • [2024-04-14 17:18:36]
  • Submitted

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...

result: