线段树求调
查看原帖
线段树求调
305532
mango09楼主2021/4/17 18:57

RTRT 样例过了,提交 22WA  8WA\;8RERE

CodeCode

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
#define lpos pos << 1
#define rpos pos << 1 | 1
using namespace std;

const int MAXN = 1e6 + 5;

int n, ans;
char s1[MAXN], s2[MAXN];
int p[100][MAXN], cnt[100], a[MAXN];

struct tree
{
	int l, r, val;
}t[MAXN << 2];

void pushup(int pos)
{
	t[pos].val = t[lpos].val + t[rpos].val;
}

inline void build(int pos, int l, int r)
{
	t[pos].l = l, t[pos].r = r;
	if (l == r)
	{
		return;
	}
	int mid = (l + r) >> 1;
	build(lpos, l, mid);
	build(rpos, mid + 1, r);
}

inline void update(int pos, int dis)
{
	int l = t[pos].l, r = t[pos].r;
	if (l == r)
	{
		t[pos].val++;
		return;
	}
	int mid = (l + r) >> 1;
	if (dis <= mid)
	{
		update(lpos, dis);
	}
	else
	{
		update(rpos, dis);
	}
	pushup(pos);
}

inline int query(int pos, int L, int R)
{
	int l = t[pos].l, r = t[pos].r;
	if (l >= L && r <= R)
	{
		return t[pos].val;
	}
	int mid = (l + r) >> 1, res;
	if (L <= mid)
	{
		res = query(lpos, L, R);
	}
	if (R > mid)
	{
		res += query(rpos, L, R);
	}
	return res;
}

signed main()
{
	scanf("%lld%s%s", &n, &s1, &s2);
	for (int i = 0; i < n; i++)
	{
		p[s1[i] - 'A'][++cnt[s1[i] - 'A']] = i + 1;
	}
	memset(cnt, 0, sizeof(cnt));
	for (int i = 0; i < n; i++)
	{
		a[i + 1] = p[s2[i] - 'A'][++cnt[s2[i]] - 'A'];
	}
	for (int i = 1; i <= n; i++)
	{
//		ans += query(1, 1, a[i]);
		ans += i - 1 - query(1, 1, a[i]);
		update(1, a[i]);
	}
	printf("%lld", ans);
	return 0;
}
2021/4/17 18:57
加载中...