月下“毛景树”

Description
毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园。 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里。爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树”下面,发现树上长着他最爱吃的毛毛果~~~ “毛景树”上有N个节点和N-1条树枝,但节点上是没有毛毛果的,毛毛果都是长在树枝上的。但是这棵“毛景树”有着神奇的魔力,他能改变树枝上毛毛果的个数:     Change k w:将第k条树枝上毛毛果的个数改变为w个。  Cover u v w:将节点u与节点v之间的树枝上毛毛果的个数都改变为w个。     Add u v w:将节点u与节点v之间的树枝上毛毛果的个数都增加w个。 由于毛毛虫很贪,于是他会有如下询问:     Max u v:询问节点u与节点v之间树枝上毛毛果个数最多有多少个。
Input
第一行一个正整数N。 接下来N-1行,每行三个正整数Ui,Vi和Wi,第i+1行描述第i条树枝。表示第i条树枝连接节点Ui和节点Vi,树枝上有Wi个毛毛果。 接下来是操作和询问,以“Stop”结束。
Output
对于毛毛虫的每个询问操作,输出一个答案。
Sample Input
4
1 2 8
1 3 7
3 4 9
Max 2 4
Cover 2 4 5
Add 1 4 10
Change 1 16
Max 2 4
Stop
Sample Output
9
16
【Data Range】
1<=N<=100,000,操作+询问数目不超过100,000。
保证在任意时刻,所有树枝上毛毛果的个数都不会超过10^9个。
题面

解题思路:边权化点权,将边权放到深度较深的点上面

对于操作:
Change k w:将第k条树枝上毛毛果的个数改变为w个。
=>直接找对应的点,线段树上单点修改
Cover u v w:将节点u与节点v之间的树枝上毛毛果的个数都改变为w个。
=>注意:u和v的lca是不应该被修改的
为了方便,我们可以先修改,再把lca改回去
Add u v w:将节点u与节点v之间的树枝上毛毛果的个数都增加w个。
=>注意:u和v的lca是不应该被加的
为了方便,我们可以先修改,再把lca减回去
Max u v:询问节点u与节点v之间树枝上毛毛果个数最多有多少个。
=>注意:u和v的lca是不应该被算进去的
我们可以先将lca赋成极小值
得到答案后在将原值赋回去
值得注意的地方是线段树的标记下放:
先修改操作,后加操作,保证正确性

  1 #include<bits/stdc++.h>
  2 #define ll long long
  3 using namespace std;
  4 const ll N=1e5+10;
  5 struct node{
  6     ll u,v,c,ne;
  7 }e[N*2];
  8 ll h[N],tot,n;
  9 void add(ll u,ll v,ll c)
 10 {
 11     tot++;e[tot]=(node){u,v,c,h[u]};h[u]=tot;
 12     e[tot+n-1]=(node){v,u,c,h[v]};h[v]=tot+n-1;
 13 }
 14 ll dep[N],size[N],son[N],f[N];
 15 ll val[N],w[N],id[N],top[N];
 16 ll Max[N*6],ad[N*6],fg[N*6];
 17 void build(ll o,ll l,ll r)
 18 {
 19     fg[o]=-1;ad[o]=0;
 20     if(l==r){
 21         Max[o]=w[l];
 22         return;
 23     }
 24     ll mid=(l+r)>>1;
 25     build(o<<1,l,mid);build(o<<1|1,mid+1,r);
 26     Max[o]=max(Max[o<<1],Max[o<<1|1]);
 27 }
 28 void down(ll o)
 29 {
 30     if(fg[o]!=-1)
 31     {
 32         fg[o<<1]=Max[o<<1]=fg[o];
 33         fg[o<<1|1]=Max[o<<1|1]=fg[o];
 34         ad[o<<1]=ad[o<<1|1]=0;
 35         fg[o]=-1;
 36     }
 37     if(ad[o])
 38     {
 39         Max[o<<1]+=ad[o];Max[o<<1|1]+=ad[o];
 40         if(fg[o<<1]!=-1) fg[o<<1]+=ad[o];
 41         else ad[o<<1]+=ad[o];
 42         if(fg[o<<1|1]!=-1) fg[o<<1|1]+=ad[o];
 43         else ad[o<<1|1]+=ad[o];
 44         ad[o]=0;
 45     }
 46 }
 47 void tchange(ll o,ll l,ll r,ll x,ll y,ll k)
 48 {
 49     if(x<=l && y>=r)
 50     {
 51         Max[o]=k;fg[o]=k;ad[o]=0;
 52         return;
 53     }
 54     down(o);
 55     ll mid=(l+r)>>1;
 56     if(x<=mid) tchange(o<<1,l,mid,x,y,k);
 57     if(y>=mid+1) tchange(o<<1|1,mid+1,r,x,y,k);
 58     Max[o]=max(Max[o<<1],Max[o<<1|1]);
 59 }
 60 void tadd(ll o,ll l,ll r,ll x,ll y,ll k)
 61 {
 62     if(x<=l && y>=r)
 63     {
 64         ad[o]+=k;Max[o]+=k;
 65         return;
 66     }
 67     down(o);
 68     ll mid=(l+r)>>1;
 69     if(x<=mid) tadd(o<<1,l,mid,x,y,k);
 70     if(y>=mid+1) tadd(o<<1|1,mid+1,r,x,y,k);
 71     Max[o]=max(Max[o<<1],Max[o<<1|1]);
 72 }
 73 ll tquery(ll o,ll l,ll r,ll x,ll y)
 74 {
 75     if(x<=l && y>=r) return Max[o];
 76     down(o);
 77     ll mid=(l+r)>>1,tmp=-1e9;
 78     if(x<=mid) tmp=max(tmp,tquery(o<<1,l,mid,x,y));
 79     if(y>=mid+1) tmp=max(tmp,tquery(o<<1|1,mid+1,r,x,y));
 80     return tmp;
 81 }
 82 void dfs1(ll u)
 83 {
 84     size[u]=1;ll p=-1;
 85     for(ll i=h[u],rr;i;i=e[i].ne)
 86     {
 87         rr=e[i].v;
 88         if(!dep[rr])
 89         {
 90             dep[rr]=dep[u]+1;f[rr]=u;val[rr]=e[i].c;
 91             dfs1(rr);size[u]+=size[rr];
 92             if(size[rr]>p)
 93              p=size[rr],son[u]=rr;
 94         }
 95     }
 96 }
 97 void dfs2(ll u,ll up)
 98 {
 99     if(u==0) return;
100     id[u]=++tot;w[tot]=val[u];
101     top[u]=up;
102     dfs2(son[u],up);
103     for(ll i=h[u],rr;i;i=e[i].ne)
104     {
105         rr=e[i].v;
106         if(rr!=f[u] && rr!=son[u]) dfs2(rr,rr);
107     }
108 }
109 void Qchange(ll x,ll y,ll k)
110 {
111     while(top[x]!=top[y])
112     {
113         if(dep[top[x]]<dep[top[y]]) swap(x,y);
114         tchange(1,1,n,id[top[x]],id[x],k);
115         x=f[top[x]];
116     }
117     if(dep[x]>dep[y]) swap(x,y);
118     tchange(1,1,n,id[x],id[y],k);
119 }
120 void Qadd(ll x,ll y,ll k)
121 {
122     while(top[x]!=top[y])
123     {
124         if(dep[top[x]]<dep[top[y]]) swap(x,y);
125         tadd(1,1,n,id[top[x]],id[x],k);
126         x=f[top[x]];
127     }
128     if(dep[x]>dep[y]) swap(x,y);
129     tadd(1,1,n,id[x],id[y],k);
130 }
131 ll Qmax(ll x,ll y)
132 {
133     ll ans=-1;
134     while(top[x]!=top[y])
135     {
136         if(dep[top[x]]<dep[top[y]]) swap(x,y);
137         ans=max(ans,tquery(1,1,n,id[top[x]],id[x]));
138         x=f[top[x]];
139     }
140     if(dep[x]>dep[y]) swap(x,y);
141     ans=max(ans,tquery(1,1,n,id[x],id[y]));
142     return ans;
143 }
144 ll lca(ll x,ll y)
145 {
146     while(top[x]!=top[y])
147     {
148         if(dep[top[x]]<dep[top[y]]) swap(x,y);
149         x=f[top[x]];
150     }
151     if(dep[x]>dep[y]) swap(x,y);
152     return x;
153 }
154 char op[10];
155 ll x,y,z,fa,tmp;
156 int main()
157 {
158     scanf("%lld",&n);
159     for(ll i=1;i<=n-1;++i)
160     {
161         scanf("%lld%lld%lld",&x,&y,&z);
162         add(x,y,z);
163     }
164     dep[1]=1;dfs1(1);
165     val[1]=-1e9;tot=0;dfs2(1,1);
166     build(1,1,n);
167     while(scanf("%s",op)!=EOF)
168     {
169         if(op[1]=='t') break;
170         if(op[1]=='h')//将第x条树枝上毛毛果的个数改变为y个
171         {
172             scanf("%lld%lld",&x,&y);
173             x=(dep[e[x].u]>dep[e[x].v] ? e[x].u:e[x].v);
174             tchange(1,1,n,id[x],id[x],y);
175         }
176         if(op[1]=='o')//将节点x与节点y之间的都改变为z个
177         {
178             scanf("%lld%lld%lld",&x,&y,&z);
179             fa=lca(x,y);tmp=tquery(1,1,n,id[fa],id[fa]);
180             Qchange(x,y,z);tchange(1,1,n,id[fa],id[fa],tmp);
181         }
182         if(op[1]=='d')//将节点x与节点y之间的都增加z个
183         {
184             scanf("%lld%lld%lld",&x,&y,&z);
185             fa=lca(x,y);
186             Qadd(x,y,z);tadd(1,1,n,id[fa],id[fa],-z);
187         }
188         if(op[1]=='a')//询问节点x与节点y之间最多有多少个
189         {
190             scanf("%lld%lld",&x,&y);
191             fa=lca(x,y);tmp=tquery(1,1,n,id[fa],id[fa]);
192             tchange(1,1,n,id[fa],id[fa],-1e9);
193             printf("%lld\n",Qmax(x,y));
194             tchange(1,1,n,id[fa],id[fa],tmp);
195         }
196     }
197     return 0;
198 }
代码

转载于:https://www.cnblogs.com/adelalove/p/8709620.html

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

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

相关文章

自由口通信模式下计算机读写PLC存储区的程序

自由口通信模式下计算机读写PLC存储区的程序 2008-8-20 8:51:00 来源&#xff1a;摘 要&#xff1a;本文介绍了在自由口通信模式下&#xff0c;用计算机读写S7-200 PLC存储区内相邻的多个字节数据的通信程序设计方法&#xff0c;程序设计中采用了多种可靠性措施。 关键词&…

Zookeeper入门

ZooKeeper 是一个开源的分布式协调架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题 本质 分布式的文件存储系统(Zookeeper文件系统监听机制)&#xff0c;是一个基于观察者模式设计的分布式服务管理框架 zookeeper的数据结构 Zookeeper的层次模型称作Data Tree,…

【laravel5.4】重定向带参数

1、 2、重定向回上一页面 3、返回上一页面带参数 转载于:https://www.cnblogs.com/xuzhengzong/p/8715463.html

Google Protocol Buffers 2.3.0 for java 快速开始

Google Protocol Buffers &#xff12;.3.0 for java 快速开始 博客分类&#xff1a; Java JavaGoogleUbuntuLinux数据结构Protocol Buffers是一个平台中立&#xff0c;编程语言无关的&#xff0c;可扩展的机制&#xff0c;是用于结构化数据串行化的灵活、高效、自动的方法&a…

jenkins api_接触Jenkins(Hudson)API,第2部分

jenkins api这篇文章从本教程的第1部分继续。 已经快一年了&#xff0c;但是我终于有时间重新审视我为与Jenkins api交互而编写的一些代码。 我已经使用了部分工作来帮助管理许多Jenkins构建服务器&#xff0c;主要是保持插件同步以及将作业从一台机器移动到另一台机器。 在本文…

JAVAC 命令详解

JAVAC 命令详解 结构 javac [ options ] [ sourcefiles ] [ files ]参数可按任意次序排列。 options 命令行选项。 sourcefiles 一个或多个要编译的源文件&#xff08;例如 MyClass.java&#xff09;。 files 一个或多个对源文件进行列表的文件。 说明 javac 有两种方法可将源…

[MEGA DEAL]终极Java捆绑包(95%折扣)

通过114个小时的培训来掌握这种流行的编码语言&#xff0c;从而开始您的编程奥德赛 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的Ultimate Java Bundle 仅售69美元&#xff0c;而不是原始价…

Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1

记录一次傻逼的问题&#xff0c; 自己把自己蠢哭&#xff1a;Mybatis 在 insert 之后想获取自增的主键 id&#xff0c;但却总是返回1 错误说明&#xff1a; 返回的1是影响的行数&#xff0c;并不是自增的主键id&#xff1b; 想要获取自增主键id&#xff0c;需要通过xx.getId()方…

android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】

android与PC&#xff0c;C#与Java 利用protobuf 进行无障碍通讯【Socket】 2011-04-27 17:00:11 标签&#xff1a;休闲 Java Socket 移动开发 android 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律…

Confluence 6 自动添加用户到用户组

默认组成员&#xff08;Default Group Memberships&#xff09;选项在 Confluence 3.5 及后续版本和 JIRA 4.3.3 及后续版本中可用。这字段将会在你选择 Read Only, with Local Groups 权限后出现。如果你希望你的用户能自动添加到用户组或多个用户组&#xff0c;在这里输入你希…

Protocol Buffers的应用与分析

Protocol Buffers的应用与分析 明尘 1 Protocol Buffers的介绍 Protocol Buffers是一种用于序列化结构化数据的机制&#xff0c;它具有灵活、高效、自动化的特点。类似于XML&#xff0c;但是比XML更小巧、快捷、简单。在Google 几乎所有它内部的RPC协议和文件格式都是采用PB。…

jenkins api_接触Jenkins(Hudson)API,第1部分

jenkins api哪一个-哈德森还是詹金斯&#xff1f; 都。 几个月前&#xff0c;我开始使用Hudson v1.395来从事这个小项目&#xff0c;在出现巨大分歧之后又回到了这个项目。 我以此为契机&#xff0c;看我将来选择永久搬到詹金斯时是否会遇到任何重大问题。 出现了一些麻烦-最值…

linux下面调试C、C++

(1)写好makefile文件&#xff08;支持debug&#xff09; objects Main.o Satellite.o TimeSystem.o SRPPara:$(objects) g -g -o SRPPara $(objects)Main.o:SRPPara.h Satellite.h TimeSystem.h g -c -g Main.cppSatellite.o:Satellite.h TimeSystem.h g -c -g Satellite.cpp…

Swing应用程序中的JavaFX 8 DatePicker

1.概述 本文显示了一个使用JavaFX 8 DatePicker控件的Java SE 8 Swing应用程序的示例。 DatePicker控件允许用户以文本形式输入日期或从日历弹出窗口中选择日期。 本示例使用其中带有FX控件的Swing JFrame 。 为了将FX内容嵌入Swing应用程序中&#xff0c; javafx.embed.swing…

java 中的override overload 比较

java 中的override & overload 比较 很久没看Java&#xff0c;忘记override和overload的区别了。百度了一下&#xff0c;把一个小弟的文章抄下来&#xff0c;备用。 方法的重写&#xff08;Overiding&#xff09;和重载&#xff08;Overloading&#xff09;是Java多态性的…

Apache Bench安装与使用

转载&#xff1a;ApacheBench&#xff08;ab&#xff09;使用详解 一、Apache Bench简介 ApacheBench 是 Apache 服务器自带的一个web压力测试工具&#xff0c;简称ab。ab又是一个命令行工具&#xff0c;对发起负载的本机要求很低&#xff0c;根据ab命令可以创建很多的并发访问…

[virtualenvwrapper] 命令小结

创建环境 mkvirtualenv env1mkvirtualenv env2环境创建之后&#xff0c;会自动进入该目录&#xff0c;并激活该环境。 切换环境 workon env1workon env2列出已有环境 workon退出环境 deactivate删除环境 rmvirtualenv创建project 项目将创建到PROJECT_HOME目录下&#xff0c;实…

轻松搭建一个Windows SVN服务器

轻松搭建一个Windows SVN服务器 前文所述SVN客户端使用的时候&#xff0c;用的SVN服务器通常为外部&#xff0c;例如Google Code的服务器&#xff0c;不过&#xff0c;做为一个程序开发人员&#xff0c;就算自己一个人写程序&#xff0c;也应该有一个SVN版本控制系统&#xff0…

cobertura覆盖率_Cobertura和Maven:集成和单元测试的代码覆盖率

cobertura覆盖率在姜黄项目中&#xff0c;我们每晚维护一个仪表板。 在仪表板上&#xff0c;我们收集有关项目的统计信息&#xff0c;包括代码覆盖率&#xff0c;findbugs分析和其他指标。 我们一直在使用Maven EMMA插件来提供代码覆盖&#xff0c;但是遇到了EMMA问题。 在对类…

人工智能常用 API

人工智能常用 API 转载 2016年07月13日 19:17:272047机器学习与预测 1、AlchemyAPI 在把数据由非结构化向结构化的转化中运用得较多。用于社交媒体监控、商业智能、内容推荐、金融交易和定向广告等。2、Alina一个加入了Alina的混搭网站展示了这一API在使用基因算法和人工神经…