QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#628592#7904. Rainbow SubarrayE7kWA 206ms5828kbC++202.6kb2024-10-10 21:08:172024-10-10 21:08:17

Judging History

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

  • [2024-10-10 21:08:17]
  • 评测
  • 测评结果:WA
  • 用时:206ms
  • 内存:5828kb
  • [2024-10-10 21:08:17]
  • 提交

answer

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define gcd __gcd
using namespace std;
typedef pair<int,int> pii;
const int INF = 9e18;
const int inf = 2e9;
const int N = 2e5 + 10;

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while(t --)
    {
        int n , k;
        cin >> n >> k ;
        vector<int> a(n + 1);
        multiset<int> mi,ma;
        int sumi = 0,suma = 0;
        for(int i = 1;i <= n;i ++) cin >> a[i];
        for(int i = 1;i <= n;i ++) a[i] -= i;
        int ans = 0;
        auto del = [&](int x,int cnt) -> void
        {
            if(x < *ma.begin())
            {
                mi.erase(x);
                sumi -= x;
            }
            else
            {
                ma.erase(x);
                suma -= x;
            }
            while(mi.size() < cnt / 2)
            {
                int t = *ma.begin();
                mi.insert(*ma.begin());
                ma.erase(ma.begin());
                suma -= t;
                sumi += t;
            }
            while(mi.size() > cnt / 2)
            {
                int t = *mi.rbegin();
                ma.insert(*mi.rbegin());
                mi.erase(mi.find(t));
                suma += t;
                sumi -= t;
            }
        };

        auto check = [&](int x,int cnt) -> bool
        {
            if(ma.size() == 0 || x > *ma.begin()) ma.insert(x),suma += x;
            else mi.insert(x),sumi += x;
            while(mi.size() < cnt / 2)
            {
                int t = *ma.begin();
                mi.insert(*ma.begin());
                ma.erase(ma.begin());
                suma -= t;
                sumi += t;
            }
            while(mi.size() > cnt / 2)
            {
                int t = *mi.rbegin();
                ma.insert(*mi.rbegin());
                mi.erase(mi.find(t));
                suma += t;
                sumi -= t;
            }
            int z = *ma.begin();
            int ans = abs(suma - (int)ma.size() * z) + abs(z * (int)mi.size() - sumi);
            // cout << "zz" << z << endl;
            if(ans > k)
            {
                del(x,cnt - 1);
            }

            return ans <= k;
        };

        for(int i = 1,j = 0;i <= n;i ++)
        {
            while(j + 1 <= n && check(a[j+1],j - i + 2)) j ++;
            ans = max(ans,j - i + 1);
            // cout << i << ' ' << j << endl;
            del(a[i],j - i);
        }
        cout << ans << endl;
    }
}

詳細信息

Test #1:

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

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: 206ms
memory: 5828kb

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 11002nd lines differ - expected: '517', found: '515'