QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#622015#7904. Rainbow SubarrayIron_gainerWA 1318ms6260kbC++202.4kb2024-10-08 19:26:212024-10-08 19:26:22

Judging History

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

  • [2024-10-08 19:26:22]
  • 评测
  • 测评结果:WA
  • 用时:1318ms
  • 内存:6260kb
  • [2024-10-08 19:26:21]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<array>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
void speed()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}
void solve()
{
	int n;
	ll k;
	cin >> n >> k;
	vector<int>a(n + 1);
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		a[i] -= i;
	}

	int l = 1, r = n;
	int mid = 0;
	auto check = [&](int mid)
		{
			if (mid == 1)
				return 1;
			multiset<int>s1,s2;
			ll sum1 = 0;
			ll sum2 = 0;
			if (a[1] < a[2])
			{
				s1.insert(a[1]);
				s2.insert(a[2]);
				sum1 += a[1];
				sum2 += a[2];
			}
			else
			{
				s2.insert(a[1]);
				s1.insert(a[2]);
				sum2 += a[1];
				sum1 += a[2];
			}
			ll need = 1e15 + 1;
			if (mid == 2)
			{
				need = sum2 - sum1;
				if (*s1.begin() == a[1])
				{
					sum1 -= *s1.begin();
					s1.erase(s1.begin());
				}
				else
				{
					sum2 -= *s2.begin();
					s2.erase(s2.begin());
				}
			}
			for (int i = 3; i <= n; i++)
			{
				if (s2.empty()||a[i] >= *s2.begin())
				{
					s2.insert(a[i]);
					sum2 += a[i];
				}
				else
				{
					s1.insert(a[i]);
					sum1 += a[i];
				}
				while (s2.size() > s1.size())
				{
					s1.insert(*s2.begin());
					sum1 += *s2.begin();
					sum2 -= *s2.begin();
					s2.erase(s2.begin());
				}
				while (s1.size() > s2.size()+1)
				{
					s2.insert(*s1.rbegin());
					sum1 -= *s1.rbegin();
					sum2 += *s1.rbegin();
					auto it = s1.end();
					it--;
					s1.erase(it);
				}
				if (i >= mid)
				{
					if (mid & 1)
					{
						need = min(need, sum2 - sum1 + *s1.rbegin());
					}
					else
					{
						need = min(need, sum2 - sum1);
					}
					auto pos1 = s1.lower_bound(a[i - mid + 1]);
					if (pos1 != s1.end())
					{
						sum1 -= a[i - mid + 1];
						s1.erase(pos1);
					}
					else
					{
						auto pos2 = s2.lower_bound(a[i - mid + 1]);
						sum2 -= a[i - mid + 1];
						s2.erase(pos2);
					}
				}
			}
			if (need <= k)
				return 1;
			else
				return 0;
		};
	while (l < r)
	{
		mid = (l + r + 1) >> 1;
		if (check(mid))
		{
			l = mid;
		}
		else
		{
			r = mid - 1;
		}
	}
	cout <</*"ans:"<<*/ l << '\n';
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

詳細信息

Test #1:

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

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: 1318ms
memory: 6260kb

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
3
4
5
1
7
5
5
5
8
5
3
6
3
5
5
8
5
4
5
3
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'