这 ** 的什么毒瘤出的题,还告诉我int范围,痛失rk1
行呗,这题就是经典套路,反正我不会树高非的优秀做法,就说说垃圾做法好了/cy
你考虑到你的 u -> v , 那么对 (
)的深度是要减掉
的,对其他区间是要加上
的,那么很显然,他说了深度是
的,那么一个点在子树内只会被覆盖
次,每次暴力覆盖,复杂度是
,查询在线段树上二分就可以了。
ps:这玩意不能模拟减掉 ,只能加上个
,然后动态开点线段树瞎搞搞就过了/cy
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize( \
"inline,-fgcse,-fgcse-lm,-fipa-sra,-ftree-pre,-ftree-vrp,-fpeephole2,-ffast-math,-fsched-spec,unroll-loops,-falign-jumps,-falign-loops,-falign-labels,-fdevirtualize,-fcaller-saves,-fcrossjumping,-fthread-jumps,-funroll-loops,-freorder-blocks,-fschedule-insns,inline-functions,-ftree-tail-merge,-fschedule-insns2,-fstrict-aliasing,-fstrict-overflow,-falign-functions,-fcse-follow-jumps,-fsched-interblock,-fpartial-inlining,no-stack-protector,-freorder-functions,-findirect-inlining,-fhoist-adjacent-loads,-frerun-cse-after-loop,inline-small-functions,-finline-small-functions,-ftree-switch-conversion,-foptimize-sibling-calls,-fexpensive-optimizations,inline-functions-called-once,-fdelete-null-pointer-checks")
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int SZ = 1 << 23 | 233;
struct FILEIN {
char qwq[SZ], *S = qwq, *T = qwq, ch;
#ifdef __WIN64
#define GETC getchar
#else
char GETC() { return (S == T) && (T = (S = qwq) + fread(qwq, 1, SZ, stdin), S == T) ? EOF : *S++; }
#endif
FILEIN& operator>>(char& c) {
while (isspace(c = GETC()))
;
return *this;
}
FILEIN& operator>>(string& s) {
while (isspace(ch = GETC()))
;
s = ch;
while (!isspace(ch = GETC())) s += ch;
return *this;
}
template <class T>
void read(T& x) {
bool sign = 0;
while ((ch = GETC()) < 48) sign ^= (ch == 45);
x = (ch ^ 48);
while ((ch = GETC()) > 47) x = (x << 1) + (x << 3) + (ch ^ 48);
x = sign ? -x : x;
}
FILEIN& operator>>(int& x) { return read(x), *this; }
} in;
struct FILEOUT {
const static int LIMIT = 1 << 22;
char quq[SZ], ST[233];
int sz, O;
~FILEOUT() { flush(); }
void flush() {
fwrite(quq, 1, O, stdout);
fflush(stdout);
O = 0;
}
FILEOUT& operator<<(char c) { return quq[O++] = c, *this; }
FILEOUT& operator<<(string str) {
if (O > LIMIT) flush();
for (char c : str) quq[O++] = c;
return *this;
}
template <class T>
void write(T x) {
if (O > LIMIT) flush();
if (x < 0) {
quq[O++] = 45;
x = -x;
}
do {
ST[++sz] = x % 10 ^ 48;
x /= 10;
} while (x);
while (sz) quq[O++] = ST[sz--];
}
FILEOUT& operator<<(int x) { return write(x), *this; }
} out;
int n, m, q;
const int maxn = 1e5 + 51;
const int QAQ = 4e15;
const int QWQ = 1e15;
struct Edge {
int v, nxt, w;
} e[maxn << 1];
int head[maxn], ecnt = 0;
void add(int u, int v, int w) {
e[++ecnt] = { v, head[u], w };
head[u] = ecnt;
}
int a[maxn], dfn[maxn], tot = 0;
int sz[maxn], fa[maxn], dep[maxn];
vector<pair<int, int>> qr[maxn];
int ans[maxn];
int ls[maxn << 8], rs[maxn << 8], val[maxn << 8];
int cnt = 0;
void upd(int l, int r, int& p, int x, int v) {
if (!p) p = ++cnt;
val[p] += v;
if (l == r) return;
int mid = l + r >> 1;
if (x <= mid)
upd(l, mid, ls[p], x, v);
else
upd(mid + 1, r, rs[p], x, v);
}
int qry(int l, int r, int p, int k) {
if (l == r) return l;
int mid = l + r >> 1;
if (k > val[ls[p]])
return qry(mid + 1, r, rs[p], k - val[ls[p]]);
else
return qry(l, mid, ls[p], k);
}
void dfs(int u) {
a[dfn[u] = ++tot] = dep[u];
sz[u] = 1;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v;
if (v == fa[u]) continue;
dep[v] = dep[u] + e[i].w, fa[v] = u, dfs(v);
sz[u] += sz[v];
}
}
int rt = 0;
void dfssolve(int u) {
upd(1, QAQ, rt, a[dfn[u]] + QWQ, -1);
for (auto x : qr[u]) ans[x.second] = qry(1, QAQ, rt, tot - x.first) + dep[u] - QWQ;
upd(1, QAQ, rt, a[dfn[u]] + QWQ, 1);
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v;
if (v == fa[u]) continue;
for (int j = dfn[v]; j <= dfn[v] + sz[v] - 1; j++) upd(1, QAQ, rt, a[j] + QWQ, -1);
for (int j = dfn[v]; j <= dfn[v] + sz[v] - 1; j++) a[j] -= e[i].w * 2;
for (int j = dfn[v]; j <= dfn[v] + sz[v] - 1; j++) upd(1, QAQ, rt, a[j] + QWQ, 1);
dfssolve(v);
for (int j = dfn[v]; j <= dfn[v] + sz[v] - 1; j++) upd(1, QAQ, rt, a[j] + QWQ, -1);
for (int j = dfn[v]; j <= dfn[v] + sz[v] - 1; j++) a[j] += e[i].w * 2;
for (int j = dfn[v]; j <= dfn[v] + sz[v] - 1; j++) upd(1, QAQ, rt, a[j] + QWQ, 1);
}
}
signed main() {
in >> n >> m >> q;
while (m--) {
int u, v, w;
in >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
for (int i = 1; i <= q; i++) {
int x, k;
in >> x >> k;
qr[x].push_back({ k, i });
}
for (int i = 1; i <= n; i++)
if (!dfn[i]) {
for (int j = 1; j <= cnt; j++) val[j] = ls[j] = rs[j] = 0;
rt = cnt = dep[i] = tot = 0;
dfs(i);
for (int j = 1; j <= tot; j++) upd(1, QAQ, rt, a[j] + QWQ, 1);
dfssolve(i);
}
for (int i = 1; i <= q; i++) out << (ans[i] <= 0 ? -1 : ans[i]) << '\n';
return 0;
} 
京公网安备 11010502036488号