整体二分是个好东西!可我忘记了它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. 【LG1527】[国家集训队]矩阵乘法

    [LG1527][国家集训队]矩阵乘法 题面 洛谷 题解 我也不知道为什么取个这样的名字... 其实就是区间\(kth\)扩展到二维 还是用整体二分搞啦,把树状数组换成二维的 其他的基本没有什么差别 ...

  2. (AOSP)repo checkout指定版本

    aosp 怎么切换分支? To properly switch Android version, all you need to change is branch for your manifest ...

  3. dubbo入门(一)

    1.简介 Dubbo由阿里巴巴开源,是一个分布式服务框架,致力于提供高性能和透明化的RPC(远程过程调用)远程服务调用方案,以及SOA服务治理方案.如果没有分布式的需求,Dbubbo是不需要的,其本质 ...

  4. 通过 zxing 生成二维码

    二维码现在随处可见,在日常的开发中,也会经常涉及到二维码的生成,特别是开发一些活动或者推广方面的功能时,二维码甚至成为必备功能点.本文介绍通过 google 的 zxing 包生成带 logo 的二维 ...

  5. 《Git学习指南》学习笔记(一)

    第二章 入门 git的安装 在Linux下,git的安装很简单.以我的系统Deepin/Ubuntu为例,只需在终端敲入sudo apt-get install git即可.其他Linux发行版可尝试 ...

  6. 大理石在哪儿 (Where is the Marble?,UVa 10474)

    题目描述:算法竞赛入门经典例题5-1 #include <iostream> #include <algorithm> using namespace std; ; int m ...

  7. Cassandra 类型转换限制

    原文地址:http://stackoverflow.com/questions/31880381/cassandra-alter-column-type-which-types-are-compati ...

  8. Executor Framework

    Why? look at the following 2 pieces of code for implementing a simple web server based on socket, ca ...

  9. 应用Response.Write实现带有进度条的多文件上传

    前几天,写过一篇随笔“使用RESPONSE.WRITE实现在页面的生命周期中前后台的交互”.说是交互,实际上也主要是在ASP.NET的页面周期中 从后台利用RESPONSE.WRITE向前台即时的推送 ...

  10. POJ 1639 Picnic Planning(最小度限制生成树)

    Description The Contortion Brothers are a famous set of circus clowns, known worldwide for their inc ...