| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
网上的题解都像是一个人写的额 一大堆废操作 给一份自己的#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100010
#define inf 0x3f3f3f3f
int k = 1, pos;
int head[maxn];
int deep[maxn], son[maxn], num[maxn], p[maxn], top[maxn], fa[maxn];
struct edge
{
int v, next;
}Edge[maxn << 1];
void addedge(int a, int b)
{
Edge[k].v = b;
Edge[k].next = head[a];
head[a] = k++;
}
void dfs1(int pos, int pre, int dep)
{
deep[pos] = dep;
num[pos] = 1;
fa[pos] = pre;
for (int i = head[pos]; i; i = Edge[i].next)
{
int v = Edge[i].v;
if (v != pre)
{
dfs1(v, pos, dep + 1);
num[pos] += num[v];
if (son[pos] == -1 || num[son[pos]] < num[v])
son[pos] = v;
}
}
}
void dfs2(int u, int pre, int v)
{
top[u] = v;
p[u] = ++pos;
if (son[u] == -1) return;
dfs2(son[u], u, v);
for (int i = head[u]; i; i = Edge[i].next)
{
int v = Edge[i].v;
if (v != pre&&v != son[u])
dfs2(v, u, v);
}
}
struct Node
{
int l, r, tag;
int Max, Min;
}cover[maxn << 2];
int n;
void build(int rt, int l, int r)
{
cover[rt].l = l;
cover[rt].r = r;
cover[rt].tag = 0;
cover[rt].Min = 0;
cover[rt].Max = 0;
if (l == r) return;
int m = (l + r) >> 1;
build(rt << 1, l, m);
build(rt << 1 | 1, m + 1, r);
}
void qufan(int rt)
{
int alt = -cover[rt].Max;
cover[rt].Max = -cover[rt].Min;
cover[rt].Min = alt;
}
void pushdown(int rt)
{
if (cover[rt].tag)
{
if (cover[rt].tag % 2)
{
cover[rt << 1].tag++;
cover[rt << 1 | 1].tag++;
qufan(rt << 1);
qufan(rt << 1 | 1);
}
cover[rt].tag = 0;
}
}
void pushup(int rt)
{
cover[rt].Min = min(cover[rt << 1].Min, cover[rt << 1 | 1].Min);
cover[rt].Max = max(cover[rt << 1].Max, cover[rt << 1 | 1].Max);
}
void change(int rt, int pos, int l, int r, int val)
{
if (l == r)
{
cover[rt].Max = cover[rt].Min = val;
return;
}
pushdown(rt);
int m = (l + r) >> 1;
if (pos <= m) change(rt << 1, pos, l, m, val);
else change(rt << 1 | 1, pos, m + 1, r, val);
pushup(rt);
}
void reverse(int rt, int l, int r, int qstart, int qend)
{
if (qstart <= l&&r <= qend)
{
cover[rt].tag++;
qufan(rt);
return;
}
pushdown(rt);
int m = (l + r) >> 1;
if (qstart <= m) reverse(rt << 1, l, m, qstart, qend);
if (m < qend) reverse(rt << 1 | 1, m + 1, r, qstart, qend);
pushup(rt);
}
int find(int rt, int l, int r, int qstart, int qend)
{
//cout << 'l' << ' ' << l << ' ' << 'r' << ' ' << r << endl;
if (qstart <= l&&r <= qend)
return cover[rt].Max;
pushdown(rt);
int Ans=-inf,m = (l + r) >> 1;
if (qstart <= m) Ans = max(Ans, find(rt << 1, l, m, qstart, qend));
if (m < qend) Ans = max(Ans, find(rt << 1 | 1, m + 1, r, qstart, qend));
return Ans;
}
int findmax(int u, int v)
{
//cout << u << ' ' << v << endl;
int tmp = -inf;
int f1 = top[u], f2 = top[v];
//cout << f1 << ' ' << f2 << endl;
while (f1 != f2)
{
if (deep[f1] < deep[f2])
{
swap(u, v);
swap(f1, f2);
}
tmp = max(tmp, find(1, 1, n, p[f1], p[u]));
u = fa[f1], f1 = top[u];
}
if (u == v) return tmp;
if (deep[u] > deep[v]) swap(u, v);
//cout << 2 << endl;
//cout << son[u] << endl;
//cout << "p1" << ' ' << p[son[u]] << ' ' << "p2" << ' ' << p[v] << endl;
return max(tmp, find(1, 1, n, p[son[u]], p[v]));
}
void Negate(int u, int v)
{
int f1 = top[u], f2 = top[v];
while (f1 != f2)
{
if (deep[f1] < deep[f2])
{
swap(u, v);
swap(f1, f2);
}
reverse(1, 1, n, p[f1], p[u]);
u = fa[f1], f1 = top[u];
}
if (u == v) return;
if (deep[u] > deep[v]) swap(u, v); //在同一条重链上但不在同一点
reverse(1, 1, n, p[son[u]], p[v]);
}
int e[maxn][3];
int main()
{
int t;
cin >> t;
while (t--)
{
k = 1, pos = 0;
memset(son, -1, sizeof(son));
memset(head, 0, sizeof(head));
cin >> n;
for (int i = 1; i < n; i++)
{
cin >> e[i][0] >> e[i][1] >> e[i][2];
addedge(e[i][0], e[i][1]);
addedge(e[i][1], e[i][0]);
}
dfs1(1, 0, 0);
dfs2(1, 0, 1);
build(1, 1, n);
for (int i = 1; i < n; i++)
{
if (deep[e[i][0]] > deep[e[i][1]])
swap(e[i][0], e[i][1]);
change(1, p[e[i][1]], 1, n, e[i][2]);
}
//cout << top[e[1][0]] << endl;
//cout << top[e[3][1]]<<endl;
char op[10];
int u, v;
while (cin >> op&&op[0] != 'D')
{
cin >> u >> v;
if (op[0] == 'Q') cout << findmax(u, v) << endl;
else
{
if (op[0] == 'N') Negate(u, v);
else change(1, p[e[u][1]], 1, n, v);
}
}
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator