QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#624037#7904. Rainbow SubarrayWaO_oWA 1604ms4368kbC++202.1kb2024-10-09 14:46:032024-10-09 14:46:25

Judging History

你现在查看的是最新测评结果

  • [2024-10-09 14:46:25]
  • 评测
  • 测评结果:WA
  • 用时:1604ms
  • 内存:4368kb
  • [2024-10-09 14:46:03]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define deg( x ) cout<<""#x"="<<x<<endl
#define endl '\n'
#define pll pair<int,int>
#define fr first
#define se second

const int N=5e5+10;
const int mod=1e9+7;

int A[ N ];

int chack( int len , int mid , int n ){
    int re=1e18;

    int ma=0 , mi=0;
    int masum=0 , misum=0;

    for( int i=1; i<=len; i++ ){
        if( A[ i ]<mid ){
            mi++; misum+=A[ i ];
        }
        else if( A[ i ]>mid ){
            ma++; masum+=A[ i ];
        }
    }

    re=min( re , ( masum-ma*mid + mi*mid-misum ) );

    int r=len;
    for( int l=1; r<=n; l++,r++ ){
        re=min( re , ( masum-ma*mid + mi*mid-misum ) );
        if( A[ l ]<mid ){
            mi--; misum-=A[ l ];
        }
        if( A[ l ]>mid ){
            ma--; masum-=A[ l ];
        }

        if( A[ r+1 ]<mid ){
            mi++; misum+=A[ r+1 ];
        }
        if( A[ r+1 ]>mid ){
            ma++; masum+=A[ r+1 ];
        }
    }

    return re;
}

bool check( int len , int n , int k ){
    int l=-1e5 , r=1e10;

    while( r-l+1 >= 4 ){ // 至少能分出 l+1 , l+2
        int mid=( r-l+1 )/3;
        int ll=l+mid , rr=l+2*mid; // 分出两个点
        int tell=chack( len , ll , n ) , terr=chack( len , rr , n ); // 点的权值

        if( tell < terr ) r=rr;
        else l=ll;
    }

    int re=1e18;
    for( int i=l; i<=r; i++ ){ // 最后三个点单独取最小值
        re=min( re , chack( len , i , n ) );
        //deg( i );
    }

    //deg( re );

    return re<=k;
}

void solve(  ){
    int n,k;
    cin>>n>>k;

    for( int i=1; i<=n; i++ ){
        cin>>A[ i ];
        A[ i ]-=i;
    }

    int l=1,r=n;
    while( l<=r ){
        int mid=l+r>>1;
        if( check( mid , n , k ) ) l=mid+1;
        else r=mid-1;
    }

    l--;
    cout<<l<<endl;

}

signed main() {
    ios::sync_with_stdio( 0 );
    cin.tie( 0 ); cout.tie( 0 );

    int T=1;
    cin>>T;

    while( T-- ){
        solve(  );
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3636kb

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
Wrong Answer
time: 1604ms
memory: 4368kb

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
7
8
7
7
1
7
6
2
4
3
1
6
7
7
3
4
3
9
3
8
6
6
3
1
6
3
1
2
4
6
4
6
4
1
4
7
1
6
3
5
6
6
1
7
5
3
1
6
4
5
3
2
2
6
2
3
10
1
4
3
1
4
5
1
7
5
4
5
8
5
3
6
3
5
5
8
5
4
5
2
1
5
2
3
3
4
8
1
3
1
2
2
8
3
1
6
8
1
8
4
5
6
6
8
4
8
3
2
8
4
5
6
2
6
2
4
1
5
4
5
3
2
4
1
2
1
4
5
8
3
7
3
3
3...

result:

wrong answer 77th lines differ - expected: '2', found: '1'