QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#550554#7904. Rainbow SubarraypotentialWA 0ms3556kbC++203.6kb2024-09-07 13:24:552024-09-07 13:24:55

Judging History

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

  • [2024-09-07 13:24:55]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3556kb
  • [2024-09-07 13:24:55]
  • 提交

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";
            while(q.size() && mp[q.top()] == 0) q.pop();
            while(p.size() && mp[p.top()] == 0) p.pop();
            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;
    }
    if(l == 40322){
        cout << n <<" " << m <<"\n";
        for(int i = 1; i <= n; i ++){
            cout << a[i] <<" \n"[i == n];
        }
    }
    // 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;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3556kb

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:


result:

wrong answer 1st lines differ - expected: '4', found: ''