小 Ad-Hoc——AT_abc484D
FlowerAccepted · · 题解
0x01 思路
不那么难的 Ad-Hoc。
稍作观察,思考怎样才能使其产生本质不同之排列。
如果每个数都不同,那么显然每种操作方式都可以造就独特的排列。
那么有相同的数怎么办?
摆弄摆弄样例就可以发现,对于每个
譬如说
再如
所以开一个桶
顺序处理
如何求此前遇到的与
记得原序列也是一个合法答案。
0x02 代码呈现
代码超短。
#include "bits/stdc++.h"
using namespace std;
#define ch(opt, tar, ...) (tar = opt({tar, __VA_ARGS__}))
#define inlfc __attribute__((always_inline)) inline
#define isz(x) ((int)x.size())
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
ll ans = 1;
cin >> n;
vector<int> a(n + 1), sum(n + 1);
for (int i = 1; i <= n; i ++) {
cin >> a[i];
sum[a[i]] ++;
if (a[i] != a[i - 1]) ans += i - sum[a[i]];
}
cout << ans;
return 0;
}
可惜 C 题耗费了过多时间,并且不会平衡树。