整体二分是个好东西!可我忘记了它QAQ其实当你知道这题可以整体二分的时候就已经不难了(个人觉得这是最难想到的一点啊)。整体二分的话,我们就可以把问题转化为是否有一条权值 \(>= k\) 的链经过某一点,这个可以通过树上差分做到 \(logn\) 的复杂度。而由于每次二分答案之后,都可以将询问和操作分成两个部分,所以是满足整体二分的性质的。

  以及自己的代码能力还有待提升啊……(;д;)

#include <bits/stdc++.h>
using namespace std;
#define lowbit(i) (i & (-i))
#define maxn 1000000
#define INF 99999999
#define CNST 20
int n, m, tot, book[maxn];
int b[maxn], id[maxn];
int C[maxn], Ans[maxn], pos[maxn];
int dfn[maxn], size[maxn], f[maxn];
int timer, cnt, ST[maxn * ][CNST];
int bit[CNST], Log[maxn * ];
map <int, int> Map; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} struct node
{
int opt, x, y, w, mark, id, rec;
}Q[maxn], ql[maxn], qr[maxn]; struct edge
{
int cnp, to[maxn], last[maxn], head[maxn];
edge() { cnp = ; }
void add(int u, int v)
{
to[cnp] = v, last[cnp] = head[u], head[u] = cnp ++;
to[cnp] = u, last[cnp] = head[v], head[v] = cnp ++;
}
}E1; void Update(int x, int y)
{
if(!x) return;
for(; x <= n; x += lowbit(x)) C[x] += y;
} int Query(int x)
{
int ret = ;
for(; x; x -= lowbit(x)) ret += C[x];
return ret;
} void dfs(int u, int fa)
{
dfn[u] = ++ timer; size[u] = ; f[dfn[u]] = dfn[fa];
ST[++ cnt][] = dfn[u]; pos[u] = cnt;
for(int i = E1.head[u]; i; i = E1.last[i])
{
int v = E1.to[i];
if(v == fa) continue;
dfs(v, u); size[u] += size[v];
ST[++ cnt][] = dfn[u];
}
} int RMQ(int u, int v)
{
u = pos[u], v = pos[v];
if(u > v) swap(u, v);
int k = Log[v - u + ];
return min(ST[u][k], ST[v - bit[k] + ][k]);
} void Check(int l, int r, int ll, int rr)
{
if(l == r)
{
for(int i = ll; i <= rr; i ++)
if(Q[i].opt == )
Ans[Q[i].id] = l ? id[l] : -;
return;
}
if(l > r) return;
int mid = (l + r) >> , sum = ;
for(int i = ll; i <= rr; i ++)
{
int x = Q[i].x, y = Q[i].y;
if(!Q[i].opt && Q[i].rec > mid)
{
Update(dfn[x], ), Update(dfn[y], );
int K = RMQ(x, y);
Update(K, -), Update(f[K], -); sum ++;
}
else if(Q[i].opt == && Q[i].rec > mid)
{
Update(dfn[x], -), Update(dfn[y], -);
int K = RMQ(x, y);
Update(K, ), Update(f[K], ); sum --;
}
else if(Q[i].opt == )
{
int x = Query(dfn[Q[i].x] + size[Q[i].x] - ) - Query(dfn[Q[i].x] - );
if(x < sum) Q[i].mark = ;
}
}
for(int i = ll; i <= rr; i ++)
{
int x = Q[i].x, y = Q[i].y;
if(!Q[i].opt && Q[i].rec > mid && !book[Q[i].id])
{
Update(dfn[x], -), Update(dfn[y], -);
int K = RMQ(x, y);
Update(K, ), Update(f[K], );
}
}
int L = , R = ;
for(int i = ll; i <= rr; i ++)
{
if(Q[i].opt == )
{
if(Q[i].mark) Q[i].mark = , qr[++ R] = Q[i];
else ql[++ L] = Q[i];
}
else if(Q[i].rec > mid) qr[++ R] = Q[i];
else ql[++ L] = Q[i];
}
int rec = ll - , ls = , rs = ;
while(ls <= L) Q[++ rec] = ql[ls], ls ++;
while(rs <= R) Q[++ rec] = qr[rs], rs ++; Check(l, mid, ll, ll + ls - );
Check(mid + , r, ll + ls - , rr);
} void init()
{
bit[] = ; for(int i = ; i < CNST; i ++) bit[i] = bit[i - ] << ;
Log[] = -; for(int i = ; i < maxn * ; i ++) Log[i] = Log[i >> ] + ;
} int main()
{
init();
n = read(), m = read();
for(int i = ; i <= m; i ++) Ans[i] = -INF;
for(int i = ; i < n; i ++)
{
int u = read(), v = read();
E1.add(u, v);
}
dfs(, );
for(int i = ; i <= Log[cnt]; i ++)
for(int j = ; j + bit[i - ] <= cnt; j ++)
ST[j][i] = min(ST[j][i - ], ST[j + bit[i - ]][i - ]);
for(int i = ; i <= m; i ++)
{
Q[i].opt = read(); Q[i].id = i;
if(Q[i].opt == )
{
Q[i].x = read(), Q[i].y = read(), Q[i].w = read();
b[++ tot] = Q[i].w;
}
else if(Q[i].opt == )
{
int t = read(); book[t] = ;
Q[i] = Q[t], Q[i].opt = ; Q[i].id = i;
}
else if(Q[i].opt == ) Q[i].x = read();
}
sort(b + , b + + tot); int tem = ;
for(int i = ; i <= tot; i ++)
if(b[i] != b[i - ]) Map[b[i]] = ++ tem, id[tem] = b[i];
tot = tem;
for(int i = ; i <= m; i ++)
if(!Q[i].opt || Q[i].opt == ) Q[i].rec = Map[Q[i].w];
Check(, tot, , m);
for(int i = ; i <= m; i ++)
if(Ans[i] != -INF) printf("%d\n", Ans[i]);
return ;
}

【题解】HNOI2016网络的更多相关文章

  1. 【LG3250】[HNOI2016]网络

    [LG3250][HNOI2016]网络 题面 洛谷 题解 30pts 对于\(m\leq 2000\),直接判断一下这个个点是否断掉一个交互,没断掉的里面取\(max\)即可,复杂度\(O(m^2\ ...

  2. 【BZOJ4538】[Hnoi2016]网络 整体二分+树状数组

    [BZOJ4538][Hnoi2016]网络 Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互 ...

  3. Luogu-3250 [HNOI2016]网络

    Luogu-3250 [HNOI2016]网络 题面 Luogu-3250 题解 CDQ分治...这个应该算是整体二分吧 二分重要度,按照时间从小到大加入大于重要度的边 对于一个询问,如果经过这个点的 ...

  4. BZOJ 4538: [Hnoi2016]网络 [整体二分]

    4538: [Hnoi2016]网络 题意:一棵树,支持添加一条u到v权值为k的路径,删除之前的一条路径,询问不经过点x的路径的最大权值 考虑二分 整体二分最大权值,如果\(k \in [mid+1, ...

  5. 4538: [Hnoi2016]网络

    4538: [Hnoi2016]网络 链接 分析: 整体二分. 对于一次操作,可以二分一个答案mid,判断权值大于mid的路径是否全部经过这个点.如果是 ,那么这次询问的答案在[l,mid-1]之间, ...

  6. [HNOI2016]网络 树链剖分,堆

    [HNOI2016]网络 LG传送门 表示乱搞比正解难想. 整体二分很好想吧. 但是为了好写快乐,我们选择三个\(\log\)的乱搞. 先树剖,线段树套堆维护区间最大值.对于一次修改,如果是插入,就把 ...

  7. 题解-[HNOI2016]序列

    题解-[HNOI2016]序列 [HNOI2016]序列 给定 \(n\) 和 \(m\) 以及序列 \(a\{n\}\).有 \(m\) 次询问,每次给定区间 \([l,r]\in[1,n]\),求 ...

  8. (BZOJ4538)HNOI2016 网络

    HNOI2016 Day1 T2 网络 Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数 ...

  9. [洛谷P3250][HNOI2016]网络

    题目大意:给定一棵树.有三种操作: $0\;u\;v\;t:$在$u$到$v$的链上进行重要度为$t$的数据传输. $1\;x:$结束第$x$个数据传输. $2\;x:$询问不经过点$x$的数据传输中 ...

随机推荐

  1. LeetCode: 57. Insert Interval(Hard)

    1. 原题链接 https://leetcode.com/problems/insert-interval/description/ 2. 题目要求 该题与上一题的区别在于,插入一个新的interva ...

  2. redis 类型、方法

    之前使用redis,现在对所有redis方法做一个总结: string类型 形式:key=>value; 说明:最简单的类型:一个key对应一个value,value保存的类型是二进制安全的,s ...

  3. nested class 例子

    #include<iostream> using namespace std; /* start of Enclosing class declaration */ class Enclo ...

  4. mysql5.6 无法远程连接问题解决

    需要配置mysql5.6版本的my.cnf文件,我的my.cnf文件配置如下: port=3306是我后来自己加上的.加上这个之后重启mysql service mysqld restart 记得给r ...

  5. jmeter "you cannot switch bacause data cannot be converted to target Tab data,empty data to switch"报错

    jmeter "you cannot switch bacause data cannot be converted to target Tab data,empty data to swi ...

  6. 腾讯云API弹性公网IP踩坑

    由于自己管理的云服务器数量比较多,时不时需要更换IP,在管理台上一下下点击,实在浪费时间,于是就想到了通过API调用的方式,将更换IP一系列动作,全部集成到Python代码里面,实现一行命令,完成IP ...

  7. Qt+opencv:读取、显示图像

    GitHub:点击下载完整代码 本文主要是使用Qt与opencv将图像进行显示在QT界面上. 程序运行后的界面如下所示: (由于只有打开图像之后,才能对图像进行翻转,所以程序设置为读取图像成功之后才能 ...

  8. CSP201703-1:分蛋糕

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  9. appcrawler遍历工具常用方法

    Usage: appcrawler [options] -a, --app <value> Android或者iOS的文件地址, 可以是网络地址, 赋值给appium的app选项 -c,  ...

  10. java并发总览