[HNOI2016]网络

problem

solution

另辟蹊径,不把交互请求赋在新增路径上,反而把交互请求赋在树上除去该请求路径覆盖点的其它点上

显然,路径问题树剖是非常可以的、

那么一个点上的信息就表示所有不经过该点的交互请求,用堆存储下来

但是又有交互请求删除问题,就在点上再来一个堆存储已经删除的请求

查询就相当于单点查询,两个大根堆,如果堆头相同,就删去,直到堆头不同

code

#include <queue>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 200005
pair < int, int > path[maxn];
int n, m, cnt;
vector < int > G[maxn];
int dfn[maxn], dep[maxn], Top[maxn], siz[maxn], son[maxn], f[maxn];struct node {int u, v, w;node(){}node( int U, int V, int W ) {u = U, v = V, w = W;}
}opt[maxn];class New_Queue {private :priority_queue < int > Delete, Vis;public :int find() {while( ! Delete.empty() && ! Vis.empty() ) {if( Delete.top() == Vis.top() )Delete.pop(), Vis.pop();elsebreak;}return Vis.empty() ? -1 : Vis.top();}void insert( int x ) {Vis.push( x );}void erase( int x ) {Delete.push( x );}
};class SegMentTree {private :New_Queue t[maxn << 2];public :void modify( int num, int l, int r, int L, int R, int w, int opt ) {if( r < L || R < l ) return;if( L <= l && r <= R ) {opt ? t[num].insert( w ) : t[num].erase( w );return;}int mid = ( l + r ) >> 1;modify( num << 1, l, mid, L, R, w, opt );modify( num << 1 | 1, mid + 1, r, L, R, w, opt );}int query( int num, int l, int r, int pos ) {if( l == r ) return t[num].find();int mid = ( l + r ) >> 1;if( pos <= mid )return max( t[num].find(), query( num << 1, l, mid, pos ) );elsereturn max( t[num].find(), query( num << 1 | 1, mid + 1, r, pos ) );}
}MS;void dfs1( int u, int fa ) {f[u] = fa, dep[u] = dep[fa] + 1, siz[u] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else dfs1( v, u );siz[u] += siz[v];if( ! son[u] || siz[v] > siz[son[u]] )son[u] = v;}
}void dfs2( int u, int t ) {dfn[u] = ++ cnt, Top[u] = t;if( ! son[u] ) return;else dfs2( son[u], t );for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == f[u] || v == son[u] ) continue;else dfs2( v, v );}
}void modify( int u, int v, int w, int opt ) {cnt = 0;while( Top[u] ^ Top[v] ) {if( dep[Top[u]] < dep[Top[v]] ) swap( u, v );path[++ cnt] = make_pair( dfn[Top[u]], dfn[u] );u = f[Top[u]];}if( dep[u] < dep[v] ) swap( u, v );path[++ cnt] = make_pair( dfn[v], dfn[u] );sort( path + 1, path + cnt + 1 );for( int i = 1, k = 0;i <= cnt;k = path[i ++].second )if( k + 1 != path[i].first )MS.modify( 1, 1, n, k + 1, path[i].first - 1, w, opt );if( path[cnt].second ^ n )MS.modify( 1, 1, n, path[cnt].second + 1, n, w, opt );
}int main() {scanf( "%d %d", &n, &m );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs1( 1, 0 ), dfs2( 1, 1 );for( int i = 1, type, a, b, v;i <= m;i ++ ) {scanf( "%d %d", &type, &a );switch( type ) {case 0 : {scanf( "%d %d", &b, &v );opt[i] = node( a, b, v );modify( a, b, v, 1 );break;}case 1 : {modify( opt[a].u, opt[a].v, opt[a].w, 0 );break;}case 2 : {printf( "%d\n", MS.query( 1, 1, n, dfn[a] ) );break;}}}return 0;
}

[HNOI2016]网络(树链剖分+线段树+大根堆)相关推荐

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

  2. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  3. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  4. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  5. P2486 [SDOI2011]染色(树链剖分+线段树)

    题干描述 输入描述 输出格式 对于每个询问操作,输出一行答案. 输入输出样例 输入 #1 复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q ...

  6. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  7. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  8. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  9. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  10. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

最新文章

  1. MSSQL 2008 数据库变成可疑状态
  2. docker修改默认存储位置
  3. 天津工业大学19年计算机考研大纲,2019年天津工业大学《计算机原理及接口技术》考研复试大纲...
  4. OS / Linux / 进程的虚拟地址空间布局
  5. 风控特征:时间滑窗统计特征体系
  6. 编程挑战:字符串的完美度
  7. 玩JerseyTest(Jersey 2.5.1和DI)
  8. 对hash签名失败_vue项目中微信jssdk在ios签名失败
  9. Joseph Problem(解约瑟夫问题)
  10. 工作283:抽离出新页面优化
  11. 【学神-RHEL7】1-3-Linux基本命令和配置服务器来电后自动开机
  12. CSS3否定伪类选择器
  13. python文件分块读取_Python多进程分块读取超大文件的方法
  14. 1018. Binary Prefix Divisible By 5可被 5 整除的二进制前缀
  15. 第二届ATI获奖自动化测试工具介绍
  16. SQL Server数据库第二课:创建数据库表、完善数据库表的设计、建立数据库表之间的关系
  17. 三菱plc pwm指令_三菱PLC指令分享,看完就会
  18. 入行嵌入式开发若干年悟出的道理
  19. 用java编写进制转换器_JAVA 简单进制转换器
  20. 全连接层输入为什么是固定维度的(拉直/压扁Flatten成为列向量)

热门文章

  1. 如何把文件压缩变成一张图片?
  2. 荐书 | 攻克世纪难题,拒绝领取菲尔兹奖的孤独数学天才的一生
  3. 数学界的高冷之王,N次拒绝巨额奖金:我穷,但是我不缺钱。。。
  4. golang ide 环境搭建_Golang 入门 : 打造开发环境
  5. thymeleaf加载不了js引用_网站首页加载慢解决方案
  6. mysql select 反选_JQuery实现全选、全不选和反选功能
  7. 学计算机与学英语作文,初二英语作文(关于计算机与学习)
  8. k8s滚动升级_k8s deployment 滚动更新
  9. 怎样安装php52-71,CentOS如何安装PHP5和PHP7
  10. python数据字符_python数据清洗系列之字符串处理详解