博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.11.07-dtoj-4032-equation
阅读量:7123 次
发布时间:2019-06-28

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

题目描述:

有一棵 $n$ 个点的以 $1$ 为根的树, 以及 $n$ 个整数变量 $x_i$ 。树上 $i$ 的父亲是 $f_i$ , 每条边 $(i,f_i)$ 有一个权值 $w_i$ ,表示一个方程 $x_i + xf_i = w_i$ ,这 $n-1$个方程构成了一个方程组。

现在给出 $q$  个操作,有两种类型:

$1 u v s$ ,表示询问加上 $x_u + x_v = s$  这个方程后,整个方程组的解的情况。具体来说, 如果方程有唯一解, 输出此时 $x_1$ 的值; 如果有无限多个解,输出 $inf$ ;如果无解,输出 $none$ . 注意每个询问是独立的。

$2 u w$ ,表示将 $w_u$  修改为 $w$ 。

输入:

第一行两个整数 $n,q$ 。

接下来 $n-1$ 行,第 $i$ 行有两个整数 $f_i+1$ 和 $w_i+1$ 。

接下来 $q$ 行,每行表示一个操作,格式见问题描述。

输出:

对于每个询问输出一行表示答案。

数据范围:

 对于所有数据 , 有 1n,q106,1fii1,1u,vn,103w,wi103,109s109 

算法标签:树状数组

思路:

 倘若把每个点都用常数和 $x_1$ 表示,我们可以发现偶数层的数呈现 $x_i=k-x_1$ ,奇数层是 $x_i=k+x_1$ 。于是倘若没有修改我们容易得出答案。但是考场我维护修改只想到树剖,然后就代码+++++,然后就心态崩了,弃了。结束之后,发现可以用树状数组差分维护,(小本本记下!!好思想!)因为每个值的修改只会影响到自己的子树,所以考虑在 $dfn[x]$ 的地方 $+v$ , $dfn[x]+sz[x]$ 的地方 $-v$ ,前缀和即为构成的贡献。妙啊!!我好菜...临退役...

以下代码:

#include
#define il inline#define LL long long#define _(d) while(d(isdigit(ch=getchar())))using namespace std;const int N=1e6+5;int n,q,head[N],to[N],ne[N],w[N],dfn[N],cnt,tot,d[N],sz[N],t[2][N],v[N];il int read(){
int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;}il void insert(int x,int y){ne[++cnt]=head[x];head[x]=cnt;to[cnt]=y;}il void ins(int op,int x,int v){
for(x;x<=n;x+=x&-x)t[op][x]+=v;}il int query(int op,int x){
int res=0;for(x;x;x-=x&-x)res+=t[op][x];return res;}il void dfs(int x){ dfn[x]=++tot;sz[x]=1; for(int i=head[x];i;i=ne[i]){ d[to[i]]=d[x]+1;v[to[i]]=w[to[i]]-v[x]; dfs(to[i]);sz[x]+=sz[to[i]]; }}int main(){ n=read();q=read(); for(int i=2;i<=n;i++){ int x=read(),z=read();insert(x,i);w[i]=z; } d[1]=1;dfs(1); while(q--){ int op=read(); if(op==1){ int x=read(),y=read(),s=read(); int res1,res2; res1=query(d[x]&1,dfn[x])+v[x]; res2=query(d[y]&1,dfn[y])+v[y]; if(((d[x]&1)^(d[y]&1))==0){ LL kk=(LL)res1+(LL)res2; if(d[x]&1){ kk=(LL)s-kk; if(kk&1ll)puts("none");else printf("%d\n",(kk>>1ll)); } else{ kk=kk-(LL)s; if(kk&1ll)puts("none");else printf("%d\n",(kk>>1ll)); } } else{ if(res1+res2==s)puts("inf"); else puts("none"); } } else{ int x=read(),z=read();int c=z-w[x]; w[x]=z;ins(d[x]&1,dfn[x],c);ins(d[x]&1,dfn[x]+sz[x],-c); ins((d[x]&1)^1,dfn[x],-c);ins((d[x]&1)^1,dfn[x]+sz[x],+c); } } return 0;}
View Code

 

转载于:https://www.cnblogs.com/Jessie-/p/9925178.html

你可能感兴趣的文章
解决最后一米信号问题飞鱼星VF-E300全新上市
查看>>
智慧城市安全问题初探
查看>>
打造NFV环境下的专属性能
查看>>
测试用例编写规范
查看>>
SWIFT系统第三家银行曝遭网络劫匪抢走1200万美元
查看>>
Java的GC机制
查看>>
espresso系列3--测试实践
查看>>
espresso基础架构与API分析
查看>>
《Python语言程序设计》——2.15 本章总结
查看>>
《音乐达人秀:Adobe Audition CC实战222例》——实例5 麦克风说话和音乐播放等所有声音都混合录制...
查看>>
TIOBE 9 月编程语言排行榜,新 TIOBE 指数算法
查看>>
《Adobe Photoshop CC经典教程》—第2课2.6节使用Spot Healing Brush工具
查看>>
《AngularJS实战》——2.3 Angular中的模板
查看>>
《Node.js区块链开发》——2.5 风险提示
查看>>
《ANSYS 14热力学/电磁学/耦合场分析自学手册》——2.9 图形窗口
查看>>
阿里 MySQL 团队加入参与 WebScaleSQL 开发
查看>>
《Adobe After Effects CC经典教程》——2.3 创建新合成图像
查看>>
提高 PHP 代码质量的 36 计
查看>>
《Adobe Premiere Pro CS4经典教程》——1.4 提供标准的数字视频工作流
查看>>
《CCNP TSHOOT 300-135学习指南》——1.4节本章小结
查看>>