当前位置: 首页 > 编程日记 > 正文

【BZOJ2157】旅游

2157: 旅游

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1460  Solved: 656
[Submit][Status][Discuss]

Description

Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,他给每座桥定义一个愉悦度w,也就是说,Ray 经过这座桥会增加w 的愉悦度,这或许是正的也可能是负的。有时,Ray 看待同一座桥的心情也会发生改变。现在,Ray 想让你帮他计算从u 景点到v 景点能获得的总愉悦度。有时,他还想知道某段路上最美丽的桥所提供的最大愉悦度,或是某段路上最糟糕的一座桥提供的最低愉悦度。

Input

输入的第一行包含一个整数N,表示T 城中的景点个数。景点编号为 0...N − 1。接下来N − 1 行,每行三个整数u、v 和w,表示有一条u 到v,使 Ray 愉悦度增加w 的桥。桥的编号为1...N − 1。|w| <= 1000。输入的第N + 1 行包含一个整数M,表示Ray 的操作数目。接下来有M 行,每行描述了一个操作,操作有如下五种形式: C i w,表示Ray 对于经过第i 座桥的愉悦度变成了w。 N u v,表示Ray 对于经过景点u 到v 的路径上的每一座桥的愉悦度都变成原来的相反数。 SUM u v,表示询问从景点u 到v 所获得的总愉悦度。 MAX u v,表示询问从景点u 到v 的路径上的所有桥中某一座桥所提供的最大愉悦度。 MIN u v,表示询问从景点u 到v 的路径上的所有桥中某一座桥所提供的最小愉悦度。测试数据保证,任意时刻,Ray 对于经过每一座桥的愉悦度的绝对值小于等于1000。

Output

对于每一个询问(操作S、MAX 和MIN),输出答案。

Sample Input

3
0 1 1
1 2 2
8
SUM 0 2
MAX 0 2
N 0 1
SUM 0 2
MIN 0 2
C 1 3
SUM 0 2
MAX 0 2

Sample Output

3
2
1
-1
5
3

HINT

一共有10 个数据,对于第i (1 <= i <= 10) 个数据, N = M = i * 2000。

Solution:

lct/树链剖分裸题(?)

首先标记的处理是一个难点 不过并不算特别难

然后最关键的来了

我们每次询问(u,v)实际上我们是询问边权而不是点权(虽然我们把边权打到了深度较大的点上)

具体来说 假如我们查询(u,v)且v跳到u的重链时不与u重合,那么我们只要计算(dfn[u]+1,dfn[v])即可

重合了呢?

首先我们会发现我们跳链的时候,每次总是会把fa[top[x]],top[x]这条边算上(显然,因为我们把标记打在了下方)

那么在最后的时候,假如重合了我们会发现u这个点的答案是没有贡献的,直接判掉就好了

附上代码 以防自己再次SB

/*To The End Of The Galaxy*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<complex>
#include<iomanip>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#define debug(x) cerr<<#x<<"="<<x<<endl
#define INF 0x7f7f7f7f
#define llINF 0x7fffffffffffll
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
inline int init()
{int now=0,ju=1;char c;bool flag=false;while(1){c=getchar();if(c=='-')ju=-1;else if(c>='0'&&c<='9'){now=now*10+c-'0';flag=true;}else if(flag)return now*ju;}
}
inline long long llinit()
{long long now=0,ju=1;char c;bool flag=false;while(1){c=getchar();if(c=='-')ju=-1;else if(c>='0'&&c<='9'){now=now*10+c-'0';flag=true;}else if(flag)return now*ju;}
}
int n,q;
struct edge
{int from,to,val,pre;
}Edge[400005];
int head[200005],fa[200005],top[200005],son[200005],depth[200005],dfn[200005],cnt,dfs_time,size[200005];
void predfs(int now,int f,int d)
{size[now]++;fa[now]=f;depth[now]=d;for(int j=head[now];j;j=Edge[j].pre){if(f!=Edge[j].to){predfs(Edge[j].to,now,d+1);size[now]+=size[Edge[j].to];if(!son[now]||size[son[now]]<size[Edge[j].to]){son[now]=Edge[j].to;}}}return;
}
void nextdfs(int now,int chain)
{top[now]=chain;dfn[now]=++dfs_time;if(son[now])nextdfs(son[now],chain);for(int j=head[now];j;j=Edge[j].pre){if(Edge[j].to!=son[now]&&Edge[j].to!=fa[now]){nextdfs(Edge[j].to,Edge[j].to);}}return;
}
inline void addedge(int from,int to,int val)
{++cnt;Edge[cnt]=((edge){from,to,val,head[from]});head[from]=cnt;
}
//----------------tree cut--------------------------
struct segment
{int l,r;int sum,max,min,tag;
}tree[1000005];
#define lson (now<<1)
#define rson (now<<1|1)
#define mid ((l+r)>>1)
void calc(int now,int delta)
{int tmpmax,tmpmin;tree[now].sum=-tree[now].sum;tmpmax=tree[now].max;tmpmin=tree[now].min;tree[now].min=-tmpmax;tree[now].max=-tmpmin;tree[now].tag^=delta;
}
void push_down(int now)
{if(!tree[now].tag)return;calc(lson,tree[now].tag);calc(rson,tree[now].tag);tree[now].tag=0;
}
void update(int now)
{tree[now].sum=tree[lson].sum+tree[rson].sum;tree[now].max=max(tree[lson].max,tree[rson].max);tree[now].min=min(tree[lson].min,tree[rson].min);    
}
void build(int l,int r,int now)
{tree[now].l=l;tree[now].r=r;if(l==r)return;else{build(l,mid,lson);build(mid+1,r,rson);}return;
}
void Modify(int l,int r,int pos,int now,int x)
{push_down(now);if(l==r){tree[now].sum=x;tree[now].min=x;tree[now].max=x;if(l==1){tree[now].sum=0;tree[now].min=INF;tree[now].max=-INF;}return;}else{if(pos<=mid)Modify(l,mid,pos,lson,x);else Modify(mid+1,r,pos,rson,x);update(now);}return;
}
int QueryMax(int l,int r,int x,int y,int now)
{push_down(now);if(l==x&&r==y){return tree[now].max;}else{if(y<=mid)return QueryMax(l,mid,x,y,lson);else if(x>mid)return QueryMax(mid+1,r,x,y,rson);else return max(QueryMax(l,mid,x,mid,lson),QueryMax(mid+1,r,mid+1,y,rson));update(now);}
}
int QueryMin(int l,int r,int x,int y,int now)
{push_down(now);if(l==x&&r==y){return tree[now].min;}else{if(y<=mid)return QueryMin(l,mid,x,y,lson);else if(x>mid)return QueryMin(mid+1,r,x,y,rson);else return min(QueryMin(l,mid,x,mid,lson),QueryMin(mid+1,r,mid+1,y,rson));update(now);}
}
int QuerySum(int l,int r,int x,int y,int now)
{push_down(now);if(l==x&&r==y){return tree[now].sum;}else{if(y<=mid)return QuerySum(l,mid,x,y,lson);else if(x>mid)return QuerySum(mid+1,r,x,y,rson);else return QuerySum(l,mid,x,mid,lson)+QuerySum(mid+1,r,mid+1,y,rson);update(now);}
}
void AddTag(int l,int r,int x,int y,int now,int delta)
{push_down(now);if(l==x&&r==y)calc(now,delta);else{if(y<=mid)AddTag(l,mid,x,y,lson,delta);else if(x>mid)AddTag(mid+1,r,x,y,rson,delta);else AddTag(l,mid,x,mid,lson,delta),AddTag(mid+1,r,mid+1,y,rson,delta);update(now);}
}
//---------------------Segment End------------------
int SolveMax(int x,int y)
{int ans=-INF;while(top[x]!=top[y]){if(depth[top[x]]<depth[top[y]])swap(x,y);ans=max(QueryMax(1,n,dfn[top[x]],dfn[x],1),ans);x=fa[top[x]];}if(x==y)return ans;if(dfn[x]>dfn[y])swap(x,y);ans=max(ans,QueryMax(1,n,dfn[x]+1,dfn[y],1));return ans;
}
int SolveMin(int x,int y)
{int ans=INF;while(top[x]!=top[y]){if(depth[top[x]]<depth[top[y]])swap(x,y);ans=min(QueryMin(1,n,dfn[top[x]],dfn[x],1),ans);x=fa[top[x]];}if(x==y)return ans;if(dfn[x]>dfn[y])swap(x,y);ans=min(ans,QueryMin(1,n,dfn[x]+1,dfn[y],1));return ans;
}
int SolveSum(int x,int y)
{int ans=0;while(top[x]!=top[y]){if(depth[top[x]]<depth[top[y]])swap(x,y);ans+=QuerySum(1,n,dfn[top[x]],dfn[x],1);x=fa[top[x]];}if(x==y)return ans;if(dfn[x]>dfn[y])swap(x,y);ans+=QuerySum(1,n,dfn[x]+1,dfn[y],1);return ans;
}
void ModifyPoint(int x,int y)
{Modify(1,n,dfn[x],1,y);return;
}
void ModifyLine(int x,int y)
{while(top[x]!=top[y]){if(depth[top[x]]<depth[top[y]])swap(x,y);AddTag(1,n,dfn[top[x]],dfn[x],1,1);x=fa[top[x]];}if(x==y)return;if(dfn[x]>dfn[y])swap(x,y);AddTag(1,n,dfn[x]+1,dfn[y],1,1);return;    
}
int main()
{int a,b,c;n=init();for(int i=1;i<n;i++){a=init();b=init();c=init();a++;b++;addedge(a,b,c);addedge(b,a,c);}predfs(1,0,0);nextdfs(1,1);int p;for(int i=1;i<=cnt;i+=2){if(depth[Edge[i].from]>depth[Edge[i].to]){p=Edge[i].from;}else p=Edge[i].to;ModifyPoint(p,Edge[i].val);}char type[15];q=init();build(1,n,1);Modify(1,n,1,1,0);for(int i=1;i<=q;i++){scanf("%s",type+1);a=init();b=init();a++;b++;if(strcmp(type+1,"SUM")==0){printf("%d\n",SolveSum(a,b));}else if(strcmp(type+1,"MAX")==0){printf("%d\n",SolveMax(a,b));}else if(strcmp(type+1,"MIN")==0){printf("%d\n",SolveMin(a,b));}else if(strcmp(type+1,"C")==0){a--;a<<=1;a--;b--;if(depth[Edge[a].from]>depth[Edge[a].to]){p=Edge[a].from;}else p=Edge[a].to;ModifyPoint(p,b);}else if(strcmp(type+1,"N")==0){ModifyLine(a,b);}}return 0;
}
View Code

转载于:https://www.cnblogs.com/redwind/p/6498420.html

相关文章:

PHP面向对象精要

1 使用extends实现继承以及重载、魔术方法的含义 class B extends A 声明的时候B里可以没有A里的方法 调用的时候$bnew B(); $b->A里的方法(); $b->A里的属性1; $b->B里的方法(); $b->B里的方法(); 如果$anew A(); 可以 $a->A里的方法(); $a->A里…

码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!

近日&#xff0c;CSDN发布了《2019-2020中国开发者调查报告》&#xff0c;本报告从2004年开始针对一年一度的CSDN开发者大调查数据分析结果形成&#xff0c;是迄今为止覆盖国内各类开发者人群数量最多、辐射地域、行业分布最广的调查活动。笔者从本次调查中&#xff0c;挑选出一…

线性代数与矩阵论 定理 1.5.6 拉格朗日插值公式

给定域$\mathbf{F}$中$n1$个不同的数$\alpha_1,\alpha_2,\cdots,\alpha_{n1}$,以及域$\mathbf{F}$中另外$n1$个数$\beta_1,\beta_2,\cdots,\beta_{n1}$,则唯一存在域$\mathbf{F}$中一个次数不超过$n$的多项式$f(x)$,使得$f(\alpha_j)\beta_j,1\leq j\leq n1$,其中 \begin{equat…

Android的ToolBar

ToolBar比ActionBar更加可控&#xff0c;自由。因此&#xff0c;Google 逐渐使用ToolBar来代替ActionBar。 使用ToolBar 1.要引入appCompat_v7支持 2.主题设置为NoActionBar 在style.xml文件中 <style name"MyAppTheme" parent"Theme.AppCompat.Light.NoActi…

利用.NET的XML序列化解决系统配置问题

作者&#xff1a;未知 请作者速与本人联系 出自&#xff1a; http://blog.csdn.net/ycl111/在Web系统开发中&#xff0c;我们经常需要读取和设置一些系统配置项&#xff0c;常见的例如数据库连接字符串、上传路径等等。在最初的ASP系统中&#xff0c;比较常用的方法是将值保存…

告别CNN?一张图等于16x16个字,计算机视觉也用上Transformer了

编译 | 凯隐出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;Transformer是由谷歌于2017年提出的具有里程碑意义的模型&#xff0c;同时也是语言AI革命的关键技术。在此之前的SOTA模型都是以循环神经网络为基础&#xff08;RNN, LSTM等&#xff09;。从本质上来讲&…

mysql left join,right join,inner join用法分析

2019独角兽企业重金招聘Python工程师标准>>> 下面是例子分析 表A记录如下&#xff1a; aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录如下: bID bName 1 2006032401 2 2006032402 3 2006032403 4 200603240…

如果BarTender出现卸载不干净的问题如何处理

自从BarTender 2016出了之后&#xff0c;好多小伙伴都想试试新功能咋样&#xff0c;这就意味着首先要卸载电脑上旧版BarTender。然而就是这个操作&#xff0c;难倒了好一批人&#xff0c;他们表示BarTender卸载卸不干净&#xff0c;不仅旧版的用不起来了&#xff0c;新版BarTen…

iometer硬盘测试工具附教程

教程地址http://servers.pconline.com.cn/skills/0711/1145597.html转载于:https://blog.51cto.com/cywin7/1081456

Python炫技操作:模块重载的五种方法

作者 | 写代码的明哥来源 | Python编程时光环境准备新建一个 foo 文件夹&#xff0c;其下包含一个 bar.py 文件$ tree foofoo└── bar.py 0 directories, 1 filebar.py 的内容非常简单&#xff0c;只写了个 print 语句print("successful to be imported")只要 bar.…

使用Powershell管理Linux 下的 SQL Server

使用Powershell管理Linux 下的 SQL Server我们上一篇文章介绍了在Centos 7.3下安装及配置 SQL Server&#xff0c;今天我们主要介绍的是如何在Windows下使用Powershell来管理Linux下的SQL Server&#xff0c;其实说到Powershell大家都已经很熟悉了&#xff0c;Powershell不止是…

这么多年,终于有人讲清楚Transformer了

作者 | Jay Alammar译者 | 香槟超新星&#xff0c;责编 | 夕颜来源 | CSDN&#xff08;ID:CSDNnews&#xff09;注意力机制是一种在现代深度学习模型中无处不在的方法&#xff0c;它有助于提高神经机器翻译应用程序性能的概念。在本文中&#xff0c;我们将介绍Transformer这种模…

提高IIS网站服务器的效率的八种方法 (转载)

作者&#xff1a;未知 请作者速与本人联系以下是提高IIS 5.0网站服务器的执行效率的八种方法&#xff1a; 1. 启用HTTP的持续作用可以改善15~20%的执行效率。 2. 不启用记录可以改善5~8%的执行效率。 3. 使用 [独立] 的处理程序会损失20%的执行效率。 4. 增加快取记忆体的保存…

搭建Docker私有仓库--自签名方式

为了能集中管理我们创建好的镜像&#xff0c;方便部署服务&#xff0c;我们会创建私有的Docker仓库。通读了一遍官方文档&#xff0c;Docker为了确保安全使用TLS,需要CA认证&#xff0c;认证时间长的要钱啊&#xff0c;免费过期时间太短&#xff0c;还是用自签名比较简单。 准备…

Visual C# .NET 2003 语言的改变

Visual C# .NET 2003 语言的改变 Prashant Sridharan Microsoft Corporation 2002年12月30日 适用于&#xff1a; Microsoft Visual Studio C# 2003 摘要&#xff1a;为了与欧洲计算机制造商协会 (ECMA) 的 C# 规范完全兼容&#xff0c;Microsoft Corporation 对 C# 编译器的…

.net内存管理与指针

本人前段时间准备做个TIN三角网的程序&#xff0c;思想是是分割合并法&#xff0c;分割的同时建立平衡二叉树&#xff0c;然后子树建三角网并相互合并&#xff0c;再向上加入父亲的点集。由于我对.net语言熟点&#xff0c;就准备用c#语言实现。但是不知从那听过当建立的类型只想…

强化学习是针对优化数据的监督学习?

作者 | Ben Eysenbach、Aviral Kumar、Abhishek Gupta 编译 | 凯隐出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;强化学习&#xff08;RL&#xff09;可以从两个不同的视角来看待&#xff1a;优化和动态规划。其中&#xff0c;诸如REINFORCE等通过计算不可微目标期…

solrcloud Read and Write Side Fault Tolerance

2019独角兽企业重金招聘Python工程师标准>>> SolrCloud supports elasticity, high availability, and fault tolerance in reads and writes. What this means, basically, is that when you have a large cluster, you can always make requests to the cluster: …

XML的二十个热点问题

http://www.netqu.com 中华技术网会员 Wuxuehui 发布翻译&#xff1a;Chen Zhihong 编辑&#xff1a;孙一中这些日子,几乎每个人都在谈论XML (Extensible Markup Language)&#xff0c;但是很少有人真正理解其含义。XML的推崇者认为它能够解决所有HTML不能解决的问题&#xff0…

5G+云网融合,移动云带领开发者释放边缘计算的力量

在5G浪潮的驱动下&#xff0c;智能设备、自动驾驶、VR/AR等对于实时性、本地性有着较强需求的场景日益丰富&#xff0c;边缘计算应运而生&#xff0c;有效提升了用户体验。众所周知&#xff0c;边缘计算技术的突破&#xff0c;意味着许多控制将通过本地设备实现而无需交由云端&…

Linux下模拟RAID5实现磁盘损坏,数据自动切换到备份磁盘上

另一个博客地址&#xff1a;www.rsyslog.org Linux社区 RAID5磁盘配额&#xff0c; 1块磁盘&#xff0c;分5个分区模拟5块磁盘&#xff0c;其中4个做成RAID5分区&#xff0c;剩余一个作为冗余磁盘&#xff0c;挂载到/data1目录&#xff0c;模拟其中一块磁盘损坏&#xff0c;冗…

jsp9大内置对象

转载于:https://www.cnblogs.com/xtdxs/p/6523059.html

RHCSA 解析-01

这是RHCSA题目开始正式做题前的准备部分。 后面会陆续连载部分类似的题型极其解法。 考试时间&#xff1a;RHCSA 2.5小时 总分300分&#xff0c;210分pass考试环境&#xff1a;考试为上机考试&#xff0c;在一台真实机系统中&#xff0c;已经预安装好虚拟机&#xff0c;要求所…

关于Visual C#装箱与拆箱的研究

关于Visual C#装箱与拆箱的研究2004-09-15 作者&#xff1a; 出处&#xff1a; CSDN在对这个问题展开讨论之前&#xff0c;我们不妨先来问这么几个问题&#xff0c;以系统的了解我们今天要探究的主题。观者也许曾无数次的使用过诸如System.Console类或.NET类库中那些品种繁多的…

Imagination推出全新多核GPU IP系列:提供33种不同配置,AI算力达24 TOPS

近日&#xff0c;致力于打造半导体和软件知识产权&#xff08;IP&#xff09; Imagination Technologies宣布推出全新的IMG B系列&#xff08;IMG B-Series&#xff09;图形处理器&#xff08;GPU&#xff09;&#xff0c;进一步扩展了其GPU知识产权&#xff08;IP&#xff09;…

ES6: 字符串

现在ES6增加了很多的字符串的方法&#xff0c;但是有些感觉自己也不是很懂&#xff0c;所以就罗列了一些平常的用的。 includes&#xff0c; startsWith&#xff0c; endsWith includes(): 返回布尔值&#xff0c;表示是否找到了参数字符串&#xff1b;startsWith(): 返回布尔值…

警惕!新版Net Transport(影音传送带)安装有猫腻

http://article.pcpop.com/show.aspx?topic_id1317935由于早些时候FlashGet和NetAnts&#xff08;网络蚂蚁&#xff09;迟迟没有新版本发布&#xff0c;Net Transport&#xff08;影音传送带&#xff09;趁虚而入&#xff0c;以免费且支持流媒体下载迅速获得了网民的青睐。不过…

我是一个平平无奇的AI神经元

来源 | 编程技术宇宙责编 | 晋兆雨头图 | CSDN付费下载自视觉中国我是一个AI神经元我是一个AI神经元&#xff0c;刚刚来到这个世界上&#xff0c;一切对我来说都特别新奇。之所以叫这个名字&#xff0c;是因为我的工作有点像人类身体中的神经元。人体中的神经元可以传递生物信号…

mysql的越过用户权限表登录

mysql的越过用户权限表登录昨天突然有个朋友对了说&#xff0c;不小心把mysql数据库的mysql库的user表给误删了&#xff0c;让我帮帮他。当是我就想到了越过用户权限表启动服务的选项skip-grant-table.自己也实验了一把&#xff0c;以前只知道有这样的方法&#xff0c;但一直没…

互联网引发全面深刻产业变革

2019独角兽企业重金招聘Python工程师标准>>> 当前&#xff0c;互联网已经渗透到社会生产生活各个方面&#xff0c;深刻改变着人类社会运行方式&#xff0c;加速着人类文明进步的步伐&#xff0c;开启了一个崭新的时代。互联网革命是人类发展史上历次科技革命的发展和…