QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#550453#7904. Rainbow SubarraypotentialWA 1304ms11072kbC++203.4kb2024-09-07 12:54:332024-09-07 12:54:33

Judging History

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

  • [2024-09-07 12:54:33]
  • 评测
  • 测评结果:WA
  • 用时:1304ms
  • 内存:11072kb
  • [2024-09-07 12:54:33]
  • 提交

answer

# include <bits/stdc++.h>
using namespace std;
# define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
# define int long long
# define lowbit(x) (x & (-x))
# define fi first
# define se second
# define all(x) x.begin(), x.end()

// # define endl '\n'

inline int Read();

typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
const int N = 1e6 + 10;

vector <int> v;

int a[N];
int n, m;
int ok(int x){
    map <int, int> mp;
    priority_queue<int, vector <int>, less <int>> q;// 大根堆 存小值
    priority_queue<int, vector <int>, greater <int>> p;// 小根堆 存大值
    if(x == 1) return 1;
    int k = (x + 1) / 2;
    int sum1 = 0, sum2 = 0;
    int num1 = 0, num2 = 0;
    for(int i = 1; i <= n; i ++){
        mp[a[i]] ++;
        if(num1 < k){
            sum1 += a[i];
            num1 += 1;
            q.push(a[i]);
        }else{
            if(a[i] > q.top()){
                sum2 += a[i];
                num2 += 1;
                p.push(a[i]);
            }else{
                q.push(a[i]);
                while(q.size()){
                    int u = q.top();
                    q.pop();
                    if(mp[u] == 0) continue;
                    sum1 -= u;
                    sum1 += a[i];
                    sum2 += u;
                    num2 ++;
                    p.push(u);
                    break;
                }
                
            }
        }
        if(i > x){
            int t = a[i - x];
            // cout << t <<" " << q.top() <<"**********\n";
            mp[t] --;
            if(t <= q.top()){
                num1 --;
                sum1 -= t;
            }else{
                num2 --;
                sum2 -= t;
                // cout << i <<"*********\n";
            }
            while(q.size() && mp[q.top()] == 0) q.pop();
            while(p.size() && mp[p.top()] == 0) p.pop();
            while(num1 < k){
                while(p.size()){
                    int u = p.top();
                    p.pop();
                    if(mp[u] == 0) continue;
                    else{
                        q.push(u);
                        num1 ++;
                        sum1 += u;
                        sum2 -= u;
                        num2 --;
                        break;
                    }
                }
            }
        }
        // cout << i <<" " << sum1 <<" " << sum2 <<"\n";
        if(i >= x){
            int t = q.top();
            // cout << t <<"**";
            // cout << t * num1 - sum1 + sum2 - t * num2 <<" ";
            // cout << num1 <<" " << num2 <<"**\n";
            if(t * num1 - sum1 + sum2 - t * num2 <= m) return 1;
        }
    }
    return 0;
}
void Solve(){
    cin >> n >> m;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
        a[i] -= i;
    }
    int l = 1, r = n, mid;
    while(l < r){
        mid = l + r + 1 >> 1;
        if(ok(mid)) l = mid;
        else r = mid - 1;
    }
    cout << l <<"\n";
    // ok(3);

}
signed main(){
    IOS;
    int T = 1;
    cin >> T;
    while (T--) 
        Solve();
    return 0;
}
inline int Read(){
    int x = 0, f = 1; char c = getchar();
    while (c < '0' || c > '9'){ if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 1304ms
memory: 11072kb

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:

wrong answer 11101st lines differ - expected: '40384', found: '40322'