P3320 [SDOI2015]寻宝游戏
若当前点集S, s[i]的dfn为a[i], 且a单调.
则答案即:d(a[1], a[2]) + d(a[2], a[3]) +… + d(a[n - 1], a[n]) + d(a[n], a[1]).
set维护.(set用法见蓝书.)
代码1如下:
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>
#include <set>
using namespace std;
#define ll long long
inline int read() {
int x = 0, f = 0; char ch = getchar();
while (!isdigit(ch)) f = ch == '-', ch = getchar();
while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
return f ? -x : x;
}
inline void print(ll x) {
if (x < 0) x = -x;
if (x < 10) putchar(x + '0');
else {
print(x / 10);
putchar(x % 10 + '0');
}
}
const int N = 1e5 + 5;
int n, m;
int head[N], nex[N << 1], ver[N << 1], val[N << 1], tot;
int dfn[N], idx[N], num;
int fa[N][20], dep[N];
int vis[N];
set<int> s;
ll dist[N], ans;
void Addedge(int x, int y, int z) {
ver[++tot] = y;
val[tot] = z;
nex[tot] = head[x];
head[x] = tot;
}
void dfs(int x, int fat) {
dfn[x] = ++num; idx[num] = x;
fa[x][0] = fat; dep[x] = dep[fat] + 1;
for (int i = 1; i < 20; ++i) {
fa[x][i] = fa[fa[x][i - 1]][i - 1]