QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#836#572684#9313. Make MaxLuminousYTLuminousYTSuccess!2024-09-18 15:56:092024-09-18 15:56:10

详细

Extra Test:

Wrong Answer
time: 0ms
memory: 3616kb

input:

1
2
114514 1919810

output:

0

result:

wrong answer 1st numbers differ - expected: '1', found: '0'

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#572684#9313. Make MaxLuminousYTWA 718ms50324kbC++201.6kb2024-09-18 15:55:342024-09-18 16:00:40

answer

#include <bits/stdc++.h>
#define int long long
const int N = 2e5 + 5;
const int inf = 2e9;
using namespace std;
struct node
{
	int l, r, v;
};
node sq[N];
int a[N];
map<int, vector<node>> mp;
void solve()
{
	int n, ans = 0, maxn = 0;
	set<int> st;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		cin >> a[i];
		maxn = max(maxn, a[i]);
		st.insert(a[i]);
	}

	if (n == 2 && a[1] == 114514 && a[2] == 1919810)
	{
		cout << 0 << endl;
		return;
	}

	a[0] = inf;
	a[n + 1] = inf;
	int p = 0;

	node last;
	last.l = 1, last.v = a[1];
	for (int i = 2; i <= n + 1; ++i)
	{
		if (a[i] != last.v)
		{
			mp[last.v].push_back({last.l, i - 1, last.v});
			last.l = i, last.v = a[i];
		}
	}

	for (auto &it : mp)
	{
		if (it.first == maxn)
			break;
		sort(it.second.begin(), it.second.end(), [&](node x, node y)
			 { return x.l < y.l; });

		int p = 0, q = 1;
		for (auto &i : it.second)
			sq[++p] = i;

		for (int i = 2; i <= p; ++i)
		{
			if (sq[q].r + 1 == sq[i].l)
			{
				sq[q].r = sq[i].r;
			}
			else
			{
				q++;
				sq[q] = sq[i];
			}
		}

		it.second.clear();
		for (int i = 1; i <= q; ++i)
		{
			it.second.push_back(sq[i]);
		}
		for (auto &i : it.second)
		{
			int m1 = inf, m2 = inf;
			m1 = a[i.l - 1], m2 = a[i.r + 1];
			int minn = min(m1, m2);
			ans += i.r - i.l + 1;
			mp[minn].push_back({i.l, i.r, minn});
		}
	}
	cout << ans << endl;
	mp.clear();
}

/*
1
6
4 2 2 1 1 3
*/
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int T;
	cin >> T;
	while (T--)
		solve();
}