QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#276910#7904. Rainbow Subarrayucup-team956#WA 821ms6580kbC++202.2kb2023-12-06 12:44:472023-12-06 12:44:48

Judging History

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

  • [2024-06-09 00:00:26]
  • hack成功,自动添加数据
  • (/hack/652)
  • [2023-12-06 12:44:48]
  • 评测
  • 测评结果:WA
  • 用时:821ms
  • 内存:6580kb
  • [2023-12-06 12:44:47]
  • 提交

answer

#include <bits/stdc++.h>
#define int long long
using namespace std;

struct Node {
    multiset<int> S ; 
    int sum = 0 ; 
    int min() { return *S.begin() ; }
    int size() {
        return S.size() ; 
    }
    void push(int x) {
        sum += x , S.insert(x) ;
    }
    int erase(int m) {
        S.erase(S.find(m)) ; 
        sum -= m ; 
        return m ; 
    }
    int pop_max() {
        return erase(*prev(S.end())) ;
    }
    int pop_min() {
        return erase(*S.begin()) ;
    }
};

int n , K ; 
void solve() {
    cin >> n >> K ;
    vector a(n , 0ll) ; 
    for (auto &i : a) cin >> i ; 
    for (int i = 0 ; i < n ; ++ i) {
        a[i] -= i ; 
    }

    auto check = [&](int len) -> bool {
        Node L , R ; 
        int sl = 0 , sr = 0 ; 
        for (int i = 0 ; i < len ; ++ i) {
            L.push(a[i]) ; 
        }
        while (L.size() > R.size()) {
            R.push(L.pop_max()) ; 
        } // L <= R
        int mid = R.min() ; 
        int tot = (L.size() * mid - L.sum) + (R.sum - R.size() * mid) ; 
        if (tot <= K) return 1 ; 

        for (int i = len ; i < n ; ++ i) {

            if (a[i - len] < R.min()) L.erase(a[i - len]) ;
            else R.erase(a[i - len]) ;
            if (a[i] <= R.min()) L.push(a[i]) ; 
            else R.push(a[i]) ;
            
            while (L.size() > R.size()) R.push(L.pop_max()) ;
            while (R.size() > 1 + L.size()) L.push(R.pop_min()) ; 
            // cout << i << ' ' << L.sum << ' ' << R.sum << '\n' ; 

            // cout << L.size() << ' ' << R.size() << '\n' ;
            int mid = R.min() ; 
            int tot = (L.size() * mid - L.sum) + (R.sum - R.size() * mid) ; 
            if (tot <= K) return 1 ; 
        }
        return 0 ; 
    };  
    // for (int i = 4 ; i <= 4 ; ++ i) {
    //     // cout << i << ' ' << check(i) << '\n' ; 
    //     check(i) ;
    // }
    int l = 1 , r = n ; 
    while (l < r) {
        int mid = l + r + 1 >> 1 ;
        if (check(mid)) l = mid ; 
        else r = mid - 1 ;
    }
    cout << l << '\n' ; 
}
signed main() {
    ios::sync_with_stdio(false) ; 
    cin.tie(0) , cout.tie(0) ; 
    int t;
    cin>>t;
    while(t--) solve();
    return 0;
} 

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3488kb

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: 821ms
memory: 6580kb

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
2
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 50th lines differ - expected: '1', found: '2'