没过第二个样例求调
查看原帖
没过第二个样例求调
573963
wbh20090611楼主2024/7/28 09:18
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
int ans, n, a[100010], l, k, u, v, kk[200010], len, s1, s2;
pair <int,int> f[100010], h[100010];
pair<int,pair<int,int> > mid[100010]; 
char b, c;
priority_queue <int> q;
priority_queue <int, vector<int>, greater<int> > p;
signed main()
{
	ios::sync_with_stdio(false);
	cin >> k >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> b >> u >> c >> v;
		if (b == c)
			ans += abs(u - v);
		else
		{
			a[++l] = abs(u - v);
			kk[++len] = u;
			kk[++len] = v;
			mid[l].fi = (u + v) >> 1;
			mid[l].se.fi = u;
			mid[l].se.se = v;
		}
	}
	if (k == 1)
	{
		sort(kk + 1, kk + 1 + len);
		int dis = (kk[len >> 1] + kk[(len >> 1) + 1]) >> 1;
		for (int i = 1; i <= len; i++)
			ans += abs(dis - kk[i]);
		printf("%lld", ans + len / 2);
	}
	else
	{
		sort(mid + 1, mid + 1 + l);
		if (l == 1)
		{
			printf("%d", ans + abs(kk[1] - kk[2]) + 1);
			return 0;
		}
		s1 = s2 = 0;
		for (int i = 1; i <= l; i++)
		{
			q.push(mid[i].se.fi);
			q.push(mid[i].se.se);
			p.push(q.top());
			q.pop();
			if (q.top() > p.top())
			{
				int xx = q.top(), yy = p.top();
				q.pop(), p.pop();
				q.push(yy);
				p.push(xx);
			}
			s1 += mid[i].se.fi + mid[i].se.se;
			s1 -= p.top();
			s2 += p.top();
			h[i].fi = s2 - s1;
		}
		while(!q.empty())
			q.pop();
		while(!p.empty())
			p.pop();
		s1 = s2 = 0;
		for (int i = l; i > 0; i--)
		{
			q.push(mid[i].se.fi);
			q.push(mid[i].se.se);
			p.push(q.top());
			q.pop();
			if (q.top() > p.top())
			{
				int xx = q.top(), yy = p.top();
				q.pop(), p.pop();
				q.push(yy);
				p.push(xx);
			}
			s1 += mid[i].se.fi + mid[i].se.se;
			s1 -= p.top();
			s2 += p.top();
			h[i].se = s2 - s1;
		}
		int lll = LONG_LONG_MAX;
		for (int i = 1; i <= l + 1; i++)
		{
			lll = min(h[i - 1].fi + h[i].se, lll);
		}
		printf("%lld", ans + lll + l);
	}
}
2024/7/28 09:18
加载中...