具体看$qzc$论文吧......陈年老物了......

主要注意每个链头一棵线段树而不是一棵全局线段树

修改操作写完就是正确的,反而是初始化调了好一会......

跑的还是很快的,有些地方没优化常数也还可以接受

在$luogu$上把$Toptree$给卡下去了,现居$rank1$......

代码的话....借鉴一下思想就行了

实现就没有必要有些地方做得一样了

#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} #define sid 100050
#define eid 200050
#define ri register int
const int inf = 1e9; struct heap {
priority_queue <int> f, g;
inline void ins(int v) { if(v != -inf) f.push(v); }
inline void era(int v) { if(v != -inf) g.push(v); }
inline int top() {
while() {
if(f.empty()) return -inf;
if(g.empty()) return f.top();
if(f.top() == g.top()) f.pop(), g.pop();
else return f.top();
}
}
} h[sid], ans; int n, m, wn, cnp;
int cap[sid], nxt[eid], node[eid], fee[eid];
inline void addeg(int u, int v, int w) {
nxt[++ cnp] = cap[u]; cap[u] = cnp; node[cnp] = v; fee[cnp] = w;
nxt[++ cnp] = cap[v]; cap[v] = cnp; node[cnp] = u; fee[cnp] = w;
} #define cur node[i]
int sz[sid], pre[sid], fa[sid], dep[sid];
inline void dfs(int o) {
sz[o] = ;
for(int i = cap[o]; i; i = nxt[i])
if(cur != fa[o]) {
fa[cur] = o; dep[cur] = dep[o] + fee[i]; dfs(cur);
sz[o] += sz[cur]; if(sz[cur] > sz[pre[o]]) pre[o] = cur;
}
} int id, onp, col[sid];
int anc[sid], len[sid], dfn[sid], ord[sid];
inline void dfs(int o, int tp) {
dfn[o] = ++ id; anc[o] = tp; ord[id] = o; len[tp] ++;
if(!pre[o]) return; dfs(pre[o], tp);
for(int i = cap[o]; i; i = nxt[i])
if(cur != fa[o] && cur != pre[o]) dfs(cur, cur);
} int tnp, rt[sid];
struct seg { int l, r, v, ls, rs; } t[sid * ]; #define dis(x) dep[ord[x]]
inline void upd(int o, int l, int r) {
int ls = t[o].ls, rs = t[o].rs, mid = (l + r) >> ;
t[o].l = max(t[ls].l, t[rs].l + dis(mid + ) - dis(l));
t[o].r = max(t[rs].r, t[ls].r + dis(r) - dis(mid));
t[o].v = max(max(t[ls].v, t[rs].v), t[ls].r + t[rs].l + dis(mid + ) - dis(mid));
} inline void build(int &o, int l, int r) {
if(!o) o = ++ onp;
if(l == r) {
int x = ord[l];
for(ri i = cap[x]; i; i = nxt[i])
if(cur != fa[x] && cur != pre[x]) h[x].ins(t[rt[cur]].l + dep[cur] - dep[x]);
int d1 = h[x].top(); h[x].era(d1); int d2 = h[x].top(); h[x].ins(d1);
t[o].l = t[o].r = max(d1, ); t[o].v = max(, max(d1, d1 + d2));
return;
}
int mid = (l + r) >> ;
build(t[o].ls, l, mid);
build(t[o].rs, mid + , r);
upd(o, l, r);
} inline void mdf(int o, int l, int r, int v, int s) {
if(l == r) {
if(v == s) {
int d1 = h[v].top(); h[v].era(d1); int d2 = h[v].top(); h[v].ins(d1);
if(col[v]) t[o].l = t[o].r = d1, t[o].v = d1 + d2;
else t[o].l = t[o].r = max(d1, ), t[o].v = max(, max(d1, d1 + d2));
}
else {
h[v].ins(t[rt[s]].l + dep[s] - dep[v]);
int d1 = h[v].top(); h[v].era(d1); int d2 = h[v].top(); h[v].ins(d1);
if(col[v]) t[o].l = t[o].r = d1, t[o].v = d1 + d2;
else t[o].l = t[o].r = max(d1, ), t[o].v = max(, max(d1, d1 + d2));
}
return;
}
int mid = (l + r) >> ;
if(dfn[v] <= mid) mdf(t[o].ls, l, mid, v, s);
else mdf(t[o].rs, mid + , r, v, s);
upd(o, l, r);
} int main() {
wn = n = read();
for(ri i = ; i < n; i ++) {
int u = read(), v = read();
int w = read(); addeg(u, v, w);
}
dfs(); dfs(, ); ans.ins();
for(ri i = n; i; i --) {
int o = ord[i]; if(o != anc[o]) continue;
build(rt[o], dfn[o], dfn[o] + len[o] - );
ans.ins(t[rt[o]].v);
}
m = read(); char opt = ;
for(ri i = ; i <= m; i ++) {
opt = gc();
while(opt != 'C' && opt != 'A') opt = gc();
if(opt == 'C') {
int x = read(); col[x] ^= ;
if(col[x] == ) wn ++; else wn --;
for(ri o = x, p = o; o; o = fa[o]) {
int f = anc[o];
int p1 = t[rt[f]].v, d1 = t[rt[f]].l;
if(fa[f]) h[fa[f]].era(t[rt[f]].l + dep[f] - dep[fa[f]]);
mdf(rt[f], dfn[f], dfn[f] + len[f] - , o, p);
int p2 = t[rt[f]].v, d2 = t[rt[f]].l;
if(p1 != p2) ans.era(p1), ans.ins(p2);
p = o = f;
}
}
else {
if(wn == ) printf("They have disappeared.\n");
else printf("%d\n", ans.top());
}
}
return ;
}

最新文章

  1. SNMP协议以及著名的MIB详解
  2. Tomcat服务器重启失败:The server may already be running in another process, or a system process may be using the port.
  3. OAF_文件系列6_实现OAF导出XML文件javax.xml.parsers/transformer(案例)
  4. JavaWeb之 Servlet执行过程 与 生命周期
  5. C#+SQL数据库备份和还原
  6. virtualbox中ubuntu和windows共享文件夹设置
  7. leetcode第一刷_Interleaving String
  8. Payoneer官网注册教程,免费申请美国银行账号
  9. ADO.net参数化查询陷阱
  10. hdu2159 FATE 经典二维背包
  11. Markdown简易语法说明
  12. sqlserver数据库发送邮箱
  13. TestNG安装及使用
  14. Django-2.1基础操作
  15. android -------- 混淆打包报错(warning - InnerClass annotations are missing corresponding EnclosingMember annotations)
  16. OCP新题,2019题库出现大量新题,062-第22题
  17. 《面向对象程序设计》c++第六次作业___calculator SE
  18. 20155204 王昊《网络对抗技术》EXP1 PC平台逆向破解
  19. Cassandra 2.x 提示“错误: 代理抛出异常错误: java.lang.NullPointerException”
  20. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

热门文章

  1. 【BZOJ】1901: Zju2112 Dynamic Rankings
  2. 【POJ】2142 The Balance 数论(扩展欧几里得算法)
  3. 【转】CentOS7 yum方式配置LAMP环境
  4. 基于canvas的图片编辑合成器
  5. git创建新分支推送到远程
  6. 用js拼接url为pathinfo模式
  7. pycharm设置字体大小
  8. .NET Framework 4安装失败
  9. windows安装linux虚拟机、修改apt源
  10. 移动端测试===adb shell top命令解释