博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【国家集训队】旅游 题解(树剖基础)
阅读量:5150 次
发布时间:2019-06-13

本文共 3884 字,大约阅读时间需要 12 分钟。

题目描述

Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。

Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,他给每座桥定义一个愉悦度w,也就是说,Ray 经过这座桥会增加w 的愉悦度,这或许是正的也可能是负的。有时,Ray 看待同一座桥的心情也会发生改变。

现在,Ray 想让你帮他计算从u 景点到v 景点能获得的总愉悦度。有时,他还想知道某段路上最美丽的桥所提供的最大愉悦度,或是某段路上最糟糕的一座桥提供的最低愉悦度。

输入输出格式

输入格式:

 

输入的第一行包含一个整数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。

 

输出格式:

 

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

样例输入:

30 1 11 2 28SUM 0 2MAX 0 2N 0 1SUM 0 2MIN 0 2C 1 3SUM 0 2MAX 0 2

样例输出:

321-153

解:

  本题题意比较明确,就是树链剖分,需要维护区间和,区间最大值,区间最小值,以及单点修改,区间乘以-1.还有一点,本题的题目中要求的是边权,而树剖求的是点权,故我们需要边权转点权。查询时,注意不要查询到两点的LCA.

  区间标记下传的时候,注意是异或,不是单纯累加;修改时,把区间的最大值用区间的最小值的相反数代替,最小值同理。修改完成。

  本题码量比较大,各位可以先尝试一下QTree1,即边权转点权+单点修改+维护区间MAX.

  本题的n可以稍微开大一点,注意线段树四倍空间,前向星两倍空间,初始时不要忘记给dep数组初始化。

  查询最大/最小/区间和的时候,我们可以压缩为一个函数(即代码中的query,多了一个参数.),可以减少码量。

  注意,不查询lca,即跳链完成后查询id[x]+1即可.例如:modify(id[x]+1,id[y],rt).

  记住建双向边,不初始化会T的很惨(像我一样).

  Code:

#include
#include
#include
#include
#define MAXN 200010#define inf 0x7fffffffusing namespace std;struct node{ int nxt,to;}e[MAXN<<1];int head[MAXN],son[MAXN],top[MAXN],dep[MAXN];int n,m,siz[MAXN],f[MAXN],a[MAXN],val[MAXN];int cnt,tot,id[MAXN],rk[MAXN],dt,rt;inline void swap(int &x,int &y){x^=y^=x^=y;}char s[10];inline int max_(int a,int b){
return a>b?a:b;}inline int min_(int a,int b){
return a
'9'){ if(ch=='-')w=-1; ch=getchar(); }while(ch>='0'&&ch<='9'){ s=(s<<1)+(s<<3)+(ch^48); ch=getchar(); }return s*w;}struct Node{ int ls,rs,sum,tag,maxn,minn,l,r;}tr[MAXN<<2];inline void add(int x,int y,int w){ e[++tot].to=y; e[tot].nxt=head[x]; head[x]=tot; a[tot]=w;}void dfs1(int u){ siz[u]=1; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; if(v==f[u])continue; f[v]=u; val[v]=a[i]; dep[v]=dep[u]+1; dfs1(v); siz[u]=siz[v]+1; if(siz[son[u]]
>1; build(li,mid,lc); build(mid+1,ri,rc); pushup(x);}void change(int x,int val,int cur){ if(tr[x].l==tr[x].r){ tr[x].sum=tr[x].maxn=tr[x].minn=val; return; }pushdown(x); int mid=(tr[x].l+tr[x].r)>>1; if(cur<=mid)change(lc,val,cur); else change(rc,val,cur); pushup(x);}void modify(int li,int ri,int x){ if(tr[x].l>=li&&tr[x].r<=ri){ tr[x].sum=-tr[x].sum,tr[x].tag^=1; int x1=tr[x].maxn,y1=tr[x].minn; tr[x].maxn=-y1,tr[x].minn=-x1; return; }pushdown(x); int mid=(tr[x].l+tr[x].r)>>1; if(li<=mid)modify(li,ri,lc); if(mid
ri||tr[x].r
=li&&tr[x].r<=ri)return tr[x].sum; pushdown(x); int mid=(tr[x].l+tr[x].r)>>1,ans=0; ans=query_s(li,ri,lc)+query_s(li,ri,rc); return ans;}int query_x(int li,int ri,int x){ if(tr[x].l>=li&&tr[x].r<=ri)return tr[x].maxn; pushdown(x); int mid=(tr[x].l+tr[x].r)>>1,ans=-inf; if(li<=mid)ans=max_(ans,query_x(li,ri,lc)); if(mid
=li&&tr[x].r<=ri){ return tr[x].minn;} pushdown(x);int mid=(tr[x].l+tr[x].r)>>1,ans=inf; if(li<=mid)ans=min_(ans,query_n(li,ri,lc)); if(mid
id[y])swap(x,y); modify(id[x]+1,id[y],rt);}int query(int x,int y,int ck){ //ck 0sum 1max 2min int fx=top[x],fy=top[y],ans; if(ck==0)ans=0;else if(ck==1)ans=-inf;else ans=inf; while(fx!=fy){ if(dep[fx]
id[y])swap(x,y); if(ck==0)ans+=query_s(id[x]+1,id[y],rt); else if(ck==1)ans=max_(ans,query_x(id[x]+1,id[y],rt)); else if(ck==2)ans=min_(ans,query_n(id[x]+1,id[y],rt)); return ans;}int main(){dep[0]=1; n=read(); for(register int i=1;i

感谢 fengsongquan dalao的指导.

转载于:https://www.cnblogs.com/h-lka/p/10798347.html

你可能感兴趣的文章
未来的Web:让你惊叹的 Chrome 浏览器实验项目
查看>>
进阶学习项目实战链接
查看>>
jQuery中的serializer序列化—炒鸡好用
查看>>
VSCode 必装的 10 个高效开发插件
查看>>
python是强类型还是弱类型语言
查看>>
mysql数据库连接错误10060
查看>>
易错题
查看>>
numpy库简单使用
查看>>
基于DRF的图书增删改查
查看>>
pandas库简介和数据结构
查看>>
利用Git版本控制管理你的项目
查看>>
windows下使用pycharm开发基于ansible api的python程序
查看>>
错误 warning: LF will be replaced by CRLF in README.md.
查看>>
博客园修改鼠标图标样式
查看>>
SQLAlchemy学习
查看>>
错误 error: The following untracked working tree files would be overwritten by merge:README.md
查看>>
BeautifulSoup模块学习文档
查看>>
LInux CentOS7 vsftpd 配置注释
查看>>
Linux CentOS7 httpd 配置注释
查看>>
Sqlserver2012 评估期已过问题
查看>>