【NOIP模拟】图论题Graph

题面

n点2n-2条有向边,数据先给一颗1为根的生成树边集,边目录按两部分给出

1、 开始的 n-1 条边描述了一颗以 1 号点为根的生成树,即每个点都可以由 1 号点 到达。

2、 接下来的 N-1 条边,一定是从 i 到 1(2<=i<=N)的有向边,保证每个点都能到

然后给出除1外每个点到1的距离,q次询问两个操作:

1 x w将第x条边的边权修改为w

2 u v问u v最短距离

【输入格式】 第一行是 2 个整数 N,Q,表示一共 N 个点 Q 次询问 接下来是 N-1 行,每行 3 个整数 U,V,W,表示了前 N-1 条边,u 到 v 的有向边 接下来 N-1 行,每行 3 个整数 U,V,W,描述了每个点到 1 号点的边,V==1 接下来是 Q 行,表示 Q 次修改与询问

【输出格式】 若干行,每行回答一次询问

20%数据 没有修改 30%数据 2<=N,Q<=1000 (其中有 10%数据没有修改) 100%数据 2<=N,Q<=100 000, 1 <=边权 <= 1000,000

分析

首先注意到了20%无修改,第一反应就想到了lca,因为lca的一大用处就是求树上两点距离

但是存在一个问题,这不是一棵普通的树,根据题意,有两种边,前n-1条边我们称为树边,后n-1条边我们称为返祖边

无修改的情况下,如果u是v的祖先,那就是纯lca模板了,关键在于如果u不是v祖先呢?那u要通过返祖边回到根节点,再从根节点走到v。但注意,u不仅可以从自身的返祖边回去,还可以从子树的返祖边回去,所以在lca时需初始化出以u回到1节点的最小代价(即对于去到整个子树每个节点的路径以及返祖的边综合起来求最小)。再加上30%的1000的数据(遍历子树的每个点修改),暴力轻松得40分

—————————————————————以下为正解——————————————————————————

首先我们在暴力的时候就考虑到了进行预处理从任意节点回根的最小代价,但现在我们必须要修改了,所以还要考虑从根到此节点的路径权值和。

定义dis[u]为从1->u->1的路径值。把返祖边记为rev[u],则1到u的树上距离为dis[u]-rev[u]

查询

则有两种情况:1.u还是v的祖先,则答案是(dis[v]-rev[v])-(dis[u]-rev[u])  //两树边相减

2.u不是v的祖先。需要在u的子树中找出最小的dis[k]值,则答案是dis[k]-(dis[u]-rev[u])+(dis[v]-rev[v])  //u返祖路径的值+从根到v的树边的值

根据上述思路,我们可以试着分两类边修改。

如果是任意节点u的树边,修改会影响到整棵子树的dis[],但是如果是返祖边只会影响u自己的dis[]。

思路大概告一段落

但在查询和修改过程中发现了一系列问题:1、需要维护子树的最小值。2、需要修改子树的dis.

所以用线段树维护dis,并通过dfs序编号(dfs序中一棵子树的节点是连续的,便于操作)。用st[u]记录以u为根的子树的开始的dfs序,ed[u]为结束的节点dfs序

#include<bits/stdc++.h>
using namespace std;
#define N 200000
#define INF 0x7fffffff
#define ll long long
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (t[p].l+t[p].r>>1)
ll first[N],dep[N],dfn[N],st[N],ed[N],dis[N],rev[N],ux[N],vx[N],wx[N];
ll fa[N][20];
ll n,q,cnt,idx;
struct email
{ll u,v;ll w;ll nxt;
}e[N*2];
struct NSD
{ll l,r;ll minx,lazy;
}t[N*4];inline void pushnow(ll p,ll val)
{t[p].lazy+=val;t[p].minx+=val;
}inline void pushup(ll p)
{t[p].minx=min(t[lc].minx,t[rc].minx);
}inline void pushdown(ll p)
{if(t[p].lazy){pushnow(lc,t[p].lazy);pushnow(rc,t[p].lazy);t[p].lazy=0;}
}void build(ll p,ll l,ll r)
{t[p].l=l;t[p].r=r;if(l==r){t[p].minx=dis[l];t[p].lazy=0;return;}build(lc,l,mid);build(rc,mid+1,r);pushup(p);
}void update(ll p,ll ql,ll qr,ll val)
{if(ql<=t[p].l&&t[p].r<=qr){pushnow(p,val);return ;}pushdown(p);if(ql<=mid)update(lc,ql,qr,val);if(qr>mid)update(rc,ql,qr,val);pushup(p);
}ll query(ll p,ll ql,ll qr)
{ll ans=INF;if(ql<=t[p].l&&t[p].r<=qr)return t[p].minx;pushdown(p);if(ql<=mid)ans=min(ans,query(lc,ql,qr));if(qr>mid)ans=min(ans,query(rc,ql,qr));pushup(p);return ans;
}inline void add(ll u,ll v,ll w)
{e[++cnt].nxt=first[u];first[u]=cnt;e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;
}void dfs(ll u,ll f)
{for(int i=1;(1<<i)<=dep[u];i++)fa[u][i]=fa[fa[u][i-1]][i-1];for(int i=first[u];i;i=e[i].nxt){int v=e[i].v;if(v==f)continue;dep[v]=dep[u]+1;fa[v][0]=u;dfs(v,u);}
}ll lca(ll x,ll y)
{if(dep[x]<dep[y])swap(x,y);ll t=dep[x]-dep[y];for(int i=0;(1<<i)<=t;i++)    if(t&(1<<i))x=fa[x][i];if(x==y)return x;for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}return fa[x][0];
}void getdfn(ll u,ll f,ll w)
{st[u]=++idx;dis[st[u]]=w+rev[u];for(int i=first[u];i;i=e[i].nxt){int v=e[i].v;if(v==f)continue;getdfn(v,u,w+e[i].w);}ed[u]=idx;
}int main()
{scanf("%lld%lld",&n,&q);for(int i=1;i<=(n-1)*2;i++){ll u,v,w;scanf("%lld%lld%lld",&u,&v,&w);ux[i]=u;vx[i]=v;wx[i]=w;if(i<n){add(u,v,w);add(v,u,w);}else    rev[u]=w;}getdfn(1,0,0);dfs(1,0);build(1,1,n);for(ll i=1;i<=q;i++){ll x;scanf("%lld",&x);if(x==1){ll k,w;scanf("%lld%lld",&k,&w);if(k>=n){update(1,st[ux[k]],st[ux[k]],w-rev[ux[k]]);rev[ux[k]]=w;}else{update(1,st[vx[k]],ed[vx[k]],w-wx[k]);wx[k]=w;}}else{ll u,v;scanf("%lld%lld",&u,&v);if(lca(u,v)==u){ll du=query(1,st[u],st[u])-rev[u];ll dv=query(1,st[v],st[v])-rev[v];printf("%lld\n",dv-du);}else{ll du=query(1,st[u],ed[u])-query(1,st[u],st[u])+rev[u];ll dv=query(1,st[v],st[v])-rev[v];printf("%lld\n",du+dv);}    }}    return 0;
}

 

转载于:https://www.cnblogs.com/NSD-email0820/p/9446553.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第56套)

第56套&#xff1a; 给定程序的功能是&#xff1a;从键盘输入若干行文本&#xff08;每行不超过80个字符&#xff09;&#xff0c;写到文件myfile4.txt中,用-1作为字符串输入结束的标志。然后将文件的内容读出显示在屏幕上。文件的读写分别由自定义函数ReadText和WriteText实现…

docker 安装nginx_docker安装nginx搭建简单文件共享服务

使用nginx开启目录浏览功能&#xff0c;实现简单的http文件共享服务。一、 首先拉取nginx镜像&#xff0c;我使用的是arm32v7/nginx镜像。docker pull arm32v7/nginx二、运行一个临时的nginx实例&#xff0c;复制容器内的nginx.conf配置文件到主机上docker run --name tmp-ngin…

java _web之Servlet简单应用

Servlet是一种独立于平台和协议的服务器端的Java应用程序&#xff0c;可以生成动态的web页面。它担当Web浏览器或其他http客户程序发出请求、与http服务器上的数据库或应用程序之间交互的中间层。 所谓动态网页&#xff0c;就是在不同时刻或不同条件下访问Web服务器上的同一个页…

BZOJ4516: [Sdoi2016]生成魔咒

BZOJ4516: [Sdoi2016]生成魔咒 Description 魔咒串由许多魔咒字符组成&#xff0c;魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。例如 S[1,2,1] 时&#xff0c;它的生成魔咒有 [1]、[2]…

matlab画泡面图,MATLAB中,( )函数可以保存图像并指定为图像文件格式。

The word "tunnel visioned "(Para 3, Line 2) most probably means______ .[解析] 男&#xff1a;简直不敢相信&#xff0c;我通过了所有考试。 女&#xff1a;被我说中了吧&#xff0c;看看你前几天&#xff0c;不是晚上失眠就是白天在屋子里走来走去的&#xff0c…

全国计算机等级考试题库二级C操作题100套(第57套)

第57套&#xff1a; 函数fun的功能是&#xff1a;把形参a所指数组中的最小值放在元素a[0]中&#xff0c;接着把 形参a所指数组中的最大值放在a[1]元素中&#xff1b;再把a所指数组元素中的次小值放 在a[2]中&#xff0c;把a所指数组元素中的次大值放在a[3]&#xff1b;其余以此…

mysql redis hbase_MySQL之基本介绍

MySQL基本介绍在学习任何一款编程语言的过程中&#xff0c;我们会发现如果我们想要存储一些数据到本地硬盘的时候无疑是有些麻烦的。今天&#xff0c;我们就学一个和储存数据有关的数据库管理系统——MySQL。为啥要学会使用数据库呢&#xff1f;因为数据库可以方便的将数据存放…

POJ-1556 The Doors 线段相交+最短路

题意&#xff1a;在一个矩形平面内&#xff0c;有若干道墙&#xff0c;现求从左部某一点到右部某一点的最短路径。 解法&#xff1a;有一个事实是线路一定是从门两边的点上通过的&#xff0c;不可能出现从中间穿过的可能。因此我们就枚举两两点之间是否可达&#xff0c;这里就要…

【matlab】Matlab三维绘图指南

Matlab是一种强大的数学计算和可视化工具,而三维绘图是其功能之一。通过Matlab的三维绘图功能,我们可以创建精美、直观的三维图形,展示和分析复杂的数据。本文将为您提供一份简明的Matlab三维绘图指南,帮助您快速上手并创建出令人印象深刻的三维图形。 准备数据在开始绘制三…

laravel mysql视图,在 Laravel 视图文件中引入 bootstrap

如何在 Laravel 视图文件中引入 bootstrap&#xff1f;对于从来没有接触过 PHP 开发框架的菜鸟来说&#xff0c;这确实是个问题。在我们这些菜鸟传统的认知里&#xff0c;要在一个 html/php 文件里引入一个外部 css 文件&#xff0c;link 标签 href 属性的值&#xff0c;应该填…

全国计算机等级考试题库二级C操作题100套(第58套)

第58套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;把形参s所指字符串中最右边的n个字符复制 到形参t所指字符数组中&#xff0c;形成一个新串。若s所指字符串的长度小于n&#xff0c;则将整个 字符串复制到形参t所指字符数组中。例如&#xff0c;形参s所…

linux mysql 修改root密码_Mac下重置mysql的root密码

php中文网最新课程每日17点准时技术干货分享我的mysql版本 MYSQL V5.7.9&#xff0c;旧版本请使用&#xff1a;UPDATE mysql.user SET PasswordPASSWORD(新密码) WHERE Userroot;Mac OS X - 重置 MySQL Root密码密码太多记不住&#xff1f;&#xff1f;你是否忘记了Mac OS 的My…

DHCP option 150与option 66的区别

转载于:https://blog.51cto.com/jaymimijay/1150777

全国计算机等级考试题库二级C操作题100套(第59套)

第59套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;在34的矩阵中找出在行上最大、在列上最小的那个元素&#xff0c;若没有符合条件的元素则输出相应信息。 例如&#xff0c;有下列矩阵&#xff1a; 1 2 13 4 7 8 10 6 3 5 9 7 程序执行结果为&#xff1a…

python期末知识点_史上最全的Python知识点整理之基本语法

一、程序的格式框架 1.缩进 缩进是指每行语句前的空白区域&#xff0c;用来表示Python程序间的包含和层次关系。 一般语句不需要缩进&#xff0c;顶行书写且不留空白。 当表示分支、循环、函数、类等含义&#xff0c;在if&#xff0c;while&#xff0c;for&#xff0c;def&…

升降压斩波电路matlab,升降压直流斩波电路及matlab仿真.doc

升降压直流斩波电路及matlab仿真目录绪论………………………………………………………………….3降压斩波电路…………………………………………………..6直流斩波电路工作原理及输出输入关系……………12D c&#xff0f;D C变换器的设计…………………………………………18测试…

AIX下RAC巡检文档 (上)

一、操作系统查看1 1> 查看操作系统&#xff08;AIX 文件系统是否合理&#xff09; 方式: " df -m ,查看所有的文件系统大小 是否>2G" 结果类似下面: $df -m Filesystem MB blocks Free %Used Iused %Iused Mounted on /dev/hd4 …

php网页多个倒计时,怎么实现一个页面有多个倒计时同时进行

后台返回时间&#xff0c;一个页面中有多个表格每个表格中有一行用来显示后台给的时间&#xff0c;比如说后台给一号表格10分钟的倒计时时间&#xff0c;给2号表格15分钟的倒计时时间&#xff0c;那我要怎么做才能使得这两个倒计时都能进行&#xff1f;&#xff1f;我自己模拟了…

全国计算机等级考试题库二级C操作题100套(第60套)

第60套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。 请在程序的下划线处填入正确的内容并把下划线删除&#xff0c;使程序得出正确的结果。 注意&#xff1a;源程序存放在考生文件夹下的BLANK1.C中。 不…

opencv在python环境下的安装_python环境下安装opencv库的方法

注意&#xff1a;安装opencv以前须要先安装numpy&#xff0c;matplotlib等python 1、安装方法windows 方法1、在线安装函数 1.先安装opencv-python测试 pip install opencv-python --userspa个人python版本是3.6.8&#xff0c;能够看到opencv安装的默认版本是 opencv_python-4.…