ABC E 奇妙写法求证复杂度
  • 板块学术版
  • 楼主tai_chi
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/9/2 21:53
  • 上次更新2023/11/2 23:46:21
查看原帖
ABC E 奇妙写法求证复杂度
781046
tai_chi楼主2023/9/2 21:53
#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
const int inf = 0x3f3f3f3f;

using namespace std;

#define pii pair<int, int>
#define pll pair<ll, ll>
#define umap unordered_map
#define all(x) x.begin(), x.end()

#define endl '\n'
#define IOS                     \
	ios::sync_with_stdio(NULL); \
	cin.tie(NULL);              \
	cout.tie(NULL)
#define qwq cout << "qwq" << endl
#define line cout << "------------------" << endl

//------------ 以下是代码 ----------------- 

const int maxn = 3e5 + 5;
int n;
int a[maxn];

int rea[maxn];
vector<int> t[maxn];

int pre[maxn];
int ans = 0;

signed main()
{
	IOS;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		pre[a[i]] = t[a[i]].size();
		t[a[i]].push_back(i);
	}
	for (int j = 1; j <= n; j++)
	{
		for (int q = 1; q <= n; q++)
		{
			if (q == a[j])
				continue;
			if (t[q].size() <= 1)
				continue;
			int l = 0, r = t[q].size() - 1;
			int res = 0;
			while (l <= r)
			{
				int mid = (l + r) / 2;
				if (t[q][mid] > j)
				{
					r = mid - 1;
					res = mid;
				}
				else
				{
					l = mid + 1;
				}
			}
			int i = (t[q].size() - 1) - res + 1, k = res;
			ans += i * k;
		}
	}
	cout << ans << endl;
	return 0;
}

2023/9/2 21:53
加载中...