TLE
查看原帖
TLE
576817
Lyrella楼主2022/8/26 15:40
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 5;
int n, cnt;
char s[N];
ll ans;
deque < int > d[30];
struct tree{int x, tag;}tr[N << 2];
void upd(int x){tr[x].x = tr[x << 1].x + tr[x << 1 | 1].x;}
void build(int x, int l, int r)
{
	if(l == r)
	{
		tr[x].x = 1;
		return;
	}
	int mid = l + r >> 1;
	build(x << 1, l, mid);
	build(x << 1 | 1, mid + 1, r);
	upd(x);
}
void pd(int x, int l, int r)
{
	int mid = l + r >> 1;
	tr[x << 1].tag += tr[x].tag;
	tr[x << 1 | 1].tag += tr[x].tag;
	tr[x << 1].x += tr[x].tag * (mid - l + 1);
	tr[x << 1 | 1].x += tr[x].tag * (r - mid);
	tr[x].tag = 0;
}
void modify(int x, int l, int r, int id)
{
	if(l == r)
	{
		tr[x].tag -= tr[x].x; tr[x].x = 0;
		return;
	}
	int mid = l + r >> 1;
	pd(x, l, r);
	if(id <= mid)modify(x << 1, l, mid, id);
	else modify(x << 1 | 1, mid + 1, r, id);
	upd(x);
}
ll query(int x, int l, int r, int L, int R)
{
	if(L <= l and r <= R)return tr[x].x;
	int mid = l + r >> 1; int ret = 0;
	pd(x, l, r);
	if(L <= mid)ret += query(x << 1, l, mid, L, R);
	if(R > mid)ret += query(x << 1 | 1, mid + 1, r, L, R);
	return ret;
}
signed main()
{
	scanf("%s", s + 1); n = strlen(s + 1);
	for(int i = 1; i <= n; i++)d[s[i] - 'A'].push_back(i);
	for(int i = 0; i < 26; i++)if(d[i].size() & 1)cnt++;
	if(cnt > 1){cout << - 1; return 0;}
	build(1, 1, n);
	for(int i = 1; i <= n / 2; i++)
	{
		ll mi = 2147483648; int now = 0;
		for(int k = 0; k < 26; k++)
		{
			if(d[k].size() < 2)continue;
			ll l = query(1, 1, n, 1, d[k][0]) - 1ll;
			ll r = query(1, 1, n, d[k][d[k].size() - 1], n) - 1ll;
			if(l + r < mi)mi = l + r, now = k;
		}
		ans += mi;
		modify(1, 1, n, d[now][0]); modify(1, 1, n, d[now][d[now].size() - 1]);
		d[now].pop_front(); d[now].pop_back();
	}
	cout << ans; return 0;
}

为什么会T?

2022/8/26 15:40
加载中...