QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#544984#7904. Rainbow SubarrayCMingWA 1482ms6952kbC++142.9kb2024-09-02 21:26:102024-09-02 21:26:10

Judging History

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

  • [2024-09-02 21:26:10]
  • 评测
  • 测评结果:WA
  • 用时:1482ms
  • 内存:6952kb
  • [2024-09-02 21:26:10]
  • 提交

answer

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

typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
#define int LL
// #define BOOL 	
const int N = 5e5 + 5;
int a[N];

#ifdef BOOL
bool solve()
#else
void solve()
#endif
{
    int n, k; cin >> n >> k;
    for(int i = 1; i <= n; i++) cin >> a[i], a[i] -= i;
    auto check = [&](int x) -> bool
    {
        LL ans = 1e18;
        multiset<int> less;
        multiset<int, greater<int>> more;
        int now = 0;
        int last = -1, cntless = 0, cntmore = 0;
        for(int i = 1, j = i; j <= n; j++)
        {
            if(j - i + 1 > x)
            {
                if(more.find(a[i]) != more.end()) more.erase(more.find(a[i]));
                else if(less.find(a[i]) != less.end()) less.erase(less.find(a[i]));
                now -= abs(a[i] - last);
                i++;
                if(more.size() > less.size() + 1)
                {
                    int t = *more.begin();
                    more.erase(more.begin());
                    less.insert(t);
                }
                
                if(less.size() > more.size())
                {
                    int t = *less.begin();
                    less.erase(less.begin());
                    more.insert(t);
                }
            }

            if(more.empty() || a[j] <= *more.begin())
                more.insert(a[j]);
            else
                less.insert(a[j]);

            if(more.size() > less.size() + 1)
            {
                int t = *more.begin();
                more.erase(more.begin());
                less.insert(t);
            }
            
            if(less.size() > more.size())
            {
                int t = *less.begin();
                less.erase(less.begin());
                more.insert(t);
            }

            int mid = *more.begin();
            if(last != -1)
            {
                if(mid > last)
                {
                    now += (mid - last) * cntless;
                    now -= (mid - last) * cntmore;
                }
                else if(mid < last)
                {
                    now -= (mid - last) * cntless;
                    now += (mid - last) * cntmore;
                }
            }
            now += abs(a[j] - mid);
            last = mid;
            cntless = more.size();
            cntmore = less.size();
            if(j >= x) ans = min(ans, now);
        }
        return ans <= k;
    };

    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(nullptr);
	int t = 1;
	cin >> t;
	while (t--)
	{
		#ifdef BOOL
		if(solve()) cout << "Yes\n";
		else cout << "No\n";
		#else
		solve();
		#endif
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 1482ms
memory: 6952kb

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
2
2
6
5
7
2
4
1
1
1
1
4
1
2
7
8
7
7
1
7
5
2
4
3
1
6
7
7
3
4
3
9
3
8
6
6
1
1
6
2
1
2
4
5
4
6
4
2
4
6
1
6
3
5
6
6
1
7
5
3
1
6
3
5
3
2
2
6
1
3
10
1
4
2
2
4
5
1
7
5
5
5
8
5
3
6
3
5
5
8
5
4
5
2
1
5
1
4
4
4
8
1
4
1
2
2
8
3
1
6
8
1
8
4
5
6
6
7
4
8
3
2
8
4
5
6
2
6
2
4
1
5
4
5
4
2
4
1
2
1
3
4
8
3
6
3
3
4...

result:

wrong answer 3rd lines differ - expected: '3', found: '2'