QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#709737#7904. Rainbow SubarrayMIS_T__TL 0ms3548kbC++232.8kb2024-11-04 16:35:352024-11-04 16:35:39

Judging History

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

  • [2024-11-04 16:35:39]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3548kb
  • [2024-11-04 16:35:35]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const i64 mod = 1000000007;
void solve() {
    i64 n,k;
    cin >> n >> k;
    vector<i64>a(n);
    for ( int i = 0 ; i < n ; i++ ) {
        cin >> a[i];
        a[i] -= i;
    }
    i64 l = 1, r = n;
    auto check = [&](i64 x)->bool{
        multiset<int,less<>>s2;
        multiset<int,greater<>>s1;
        map<int,int>mp1,mp2;
        i64 sum1 = 0, sum2 = 0;
        for ( int i = 0 ; i < x-1 ; i++ ) {
            s1.insert(a[i]);
            mp1[a[i]]++;
            sum1 += a[i];
            if ( s1.size() > (x+1)/2 ) {
                int t = *s1.begin();
                mp1[t]--;
                mp2[t]++;
                sum1 -= t;
                sum2 += t;
                s2.insert(*s1.begin());
                s1.erase(s1.begin());
            }
        }
        for ( int i = x-1 ; i < n ; i++ ) {
            if ( s1.size() != (x+1)/2 ) {
                int t = *s2.begin();
                if ( a[i] > t ) {
                    sum2 -= t;
                    mp2[t]--;
                    s2.erase(s2.begin());
                    sum2 += a[i];
                    mp2[a[i]]++;
                    s2.insert(a[i]);
                    sum1 += t;
                    mp1[t]++;
                    s1.insert(t);
                } else {
                    sum1 += a[i];
                    mp1[a[i]]++;
                    s1.insert(a[i]);
                }
            } else {
                int t = *s1.begin();
                if ( a[i] < t ) {
                    sum1 -= t;
                    mp1[t]--;
                    s1.erase(s1.begin());
                    sum1 += a[i];
                    mp1[a[i]]++;
                    s1.insert(a[i]);
                    sum2 += t;
                    mp2[t]++;
                    s2.insert(t);
                } else {
                    sum2 += a[i];
                    mp2[a[i]]++;
                    s2.insert(a[i]);
                }
            }
            i64 t = *s1.begin();
            if ( k >= s1.size()*t-sum1+sum2-s2.size()*t ) {
                return 1;
            }
            if ( mp1[a[i-x+1]] ) {
                mp1[a[i-x+1]]--;
                s1.extract(a[i-x+1]);
                sum1 -= a[i-x+1];
            } else {
                mp2[a[i-x+1]]--;
                s2.extract(a[i-x+1]);
                sum2 -= a[i-x+1];
            }
        }
        return 0;

    };
    while ( r > l ) {
        i64 m = (l+r+1)/2;
        if ( check(m) ) {
            l = m;
        } else {
            r = m-1;
        }
    }
    cout << l << '\n';
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int T = 1;
    cin >> T;
    while ( T-- ) {
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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
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
2
4
5
1
7
5
5
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: