equation

equation

题目描述

 

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

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

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

2 u w,表示将 wu 修改为 w。


solution

首先我们把所有点的权值写成W+x1 或W-x1的样子。

那么每次询问就相当于挑两个点解方程。

现在剩下修改。

修改一个点,它对自己子树的贡献按深度为+1 -1 +1...

一开始先dfs

对于每一个点记一个op为 +1 -1

统计时乘上系数即可。

由于是区间修改,单点查询,可以ccj线段树或差分再树状数组实现

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 1000005
#define ll long long
using namespace std;
int n,q,OP,head[maxn],f[maxn],w[maxn],tot;
int dfst[maxn],dfsn[maxn],sc,op[maxn],val[maxn];
int t1,t2,t3,li,ri,dy[maxn];
struct node{int v,nex;
}e[maxn];
struct no{ll v;
}tree[maxn*8];
void lj(int t1,int t2){e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs(int k,int opt){dfst[k]=++sc;op[k]=opt;dy[sc]=k;for(int i=head[k];i;i=e[i].nex){val[e[i].v]=-val[k]+w[e[i].v];dfs(e[i].v,-opt);}dfsn[k]=sc;
}
void build(int k,int L,int R){if(L==R){tree[k].v=op[dy[L]]*val[dy[L]];return;}int mid=L+R>>1;build(k*2,L,mid);build(k*2+1,mid+1,R);
}
void ch(int k,int v,int l,int r){if(l>=li&&r<=ri){tree[k].v+=v;//cout<<"change "<<tree[k].l<<' '<<tree[k].r<<' '<<tree[k].v<<endl;return;}int mid=l+r>>1;if(li<=mid)ch(k*2,v,l,mid);if(ri>mid)ch(k*2+1,v,mid+1,r);
}
ll ask(int k,int pl,int opt,ll now,int l,int r){now+=opt*tree[k].v;if(l==r)return now;//cout<<tree[k].l<<' '<<tree[k].r<<' '<<now<<endl; int mid=l+r>>1;if(pl<=mid)return ask(k*2,pl,opt,now,l,mid);else return ask(k*2+1,pl,opt,now,mid+1,r);
}
int get(){int v=0;char ch;while(!isdigit(ch=getchar()));v=v+ch-48;while(isdigit(ch=getchar()))v=(v<<3)+(v<<1)+ch-48;return v;
}
int main()
{cin>>n>>q;for(int i=2;i<=n;i++){scanf("%d%d",&f[i],&w[i]);lj(f[i],i);}dfs(1,1);build(1,1,n);//for(int i=1;i<=n;i++)cout<<i<<' '<<val[i]<<' '<<op[i]<<endl;for(int i=1;i<=q;i++){scanf("%d",&OP);if(OP==1){scanf("%d%d%d",&t1,&t2,&t3);ll v1=ask(1,dfst[t1],op[t1],0,1,n),v2=ask(1,dfst[t2],op[t2],0,1,n);if(op[t1]+op[t2]==0){if(v1+v2==t3)puts("inf");else puts("none");}else {ll tmp=t3-v1-v2;if(tmp%2==0)printf("%lld\n",tmp/2*op[t1]);else puts("none");}}else {scanf("%d%d",&t1,&t2);li=dfst[t1],ri=dfsn[t1];ch(1,-op[t1]*w[t1],1,n);w[t1]=t2;ch(1,op[t1]*w[t1],1,n);}}return 0;
}

 

转载于:https://www.cnblogs.com/liankewei/p/10358775.html

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

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

相关文章

Ubuntu开启FTP服务方法(Ubuntu和Windows之间互传文件需要开启——服务器端)

目录Ubuntu开启FTP服务步骤&#xff1a;Ubuntu开启FTP服务步骤&#xff1a; 工作中Ubuntu和Windows之间互传文件&#xff0c;需要服务器端&#xff08;Ubuntu&#xff09;开启FTP服务&#xff0c;客户端&#xff08;Windows&#xff09;安装FileZilla。平时自己学习电脑安装虚拟…

舞伴配对问题java_舞伴配对问题

循环队列的应用——舞伴配对问题&#xff1a;在舞会上&#xff0c;男、女各自排成一队。舞会开始时&#xff0c;依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等&#xff0c;则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定&#xf…

逆元

复习逆元…… 逆元 求法&#xff1a; 1&#xff0c;快速幂     根据费马小定理有\(a^{p - 1} \equiv 1 \quad (mod \quad p)\),把左边拆开一下得到     \[a \cdot a^{p - 2} \equiv 1 \quad (mod \quad p)\]     因此\(a^{p - 2}\)为\(a\)在\(mod \quad p\)意义下的…

java如何让线程等待_如何使Java线程等待另一个线程的输出?

我真的建议你经历一个教程&#xff0c;如Sun’s Java Concurrency&#xff0c;你开始在多线程的魔法世界。还有一些好书出来了(google for“Concurrent Programming in Java”&#xff0c;“Java Concurrency in Practice”)。要得到你的答案&#xff1a;在你必须等待dbThread的…

win7共享wifi

为什么80%的码农都做不了架构师&#xff1f;>>> 1.从开始菜单找到“命令提示符”&#xff0c;或直接键入cmd快速搜索&#xff0c;右键单击它&#xff0c;选择“以管理员身份运行” 2.运行以下命令启用虚拟无线网卡&#xff1a; netsh wlan set hostednetwork mod…

Ubuntu开启NFS、SSH服务(驱动开发用到、电脑端登录ARM板用到)

参考&#xff1a;Ubuntu下NFS服务的开启 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-08-04 14:06:58 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107784877 目录NFS服务的开启1.安装NFS服务2.创建 linux 工作目录3.配置NFSUbuntu下SSH…

【整理】MySQL 之 autocommit

2019独角兽企业重金招聘Python工程师标准>>> mysql 默认是开启 auto commit 的。可以通过如下命令查看 session 级别和 global 级别的设置&#xff1a; mysql> select session.autocommit; ---------------------- | session.autocommit | ---------------------…

java某个类避免findbug检查_Findbugs能否在java中检测到捕获RuntimeException?

你能不能让我知道Findbugs可以在java中检测到catcing RuntimeException吗&#xff1f;有效的java建议我们不要捕获RuntimeException.所以我想知道Findbugs可以抓错了.另外,我已经检查过Klocwork JD.CATCH和checkstyle IllegalCatch是否适用于此目的.最佳答案 有点.在findbugs中…

交叉编译链的安装

参考&#xff1a;嵌入式 交叉编译链的安装 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-08-04 18:13:13 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107789879 目录什么是交叉编译器交叉编译器的下载交叉编译器的安装1.把下载的文件放到…

Scrapy将爬取的段落整合为字符串

使用Scrapy框架爬取文章的时候&#xff0c;经常会遇到要爬取多个段落的问题&#xff0c;如果这个时候使用的是&#xff1a; text response.xpath("......").extract() 那么会发现爬取下来的文章是以段落为单位的list&#xff0c;不方便直接展示。 这个时候可以将lis…

Ubuntu下安装VS Code以及C/C++插件(PS工作目录的创建)

参考&#xff1a;Visual Studio Code Ubuntu下安装 以及C/C插件大全 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-08-05 11:55:53 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107811506 目录为何选择安装VS CodeVisual Studio Code 安装…

Common Lisp中调用R

2019独角兽企业重金招聘Python工程师标准>>> R是功能强大的统计软件&#xff0c;和Lisp一样也有一个交互式的命令行环境&#xff0c;还有众多的扩展库&#xff0c;可以用来进行专业的统计分析。要在Common Lisp中方便的调用R的功能&#xff0c;可以试用rcl这个库。安…

java生成pdf加密_java使用iText 生成PDF全攻略(表格,加密)

java使用iText 生成PDF全攻略,包括创建文档,设置字体,添加表格(PdfPTable),创建新页(newPage),设置布局,加密主要使用的jar包: itextpdf-5.4.2.jar,itext-pdfa-5.4.2.jar,itext-xtra-5.4.2.jar,如果用到中文&#xff0c;需要CJK字体的扩展包&#xff1a;itext-asian.jar如果用到…

恩智浦NXP I.MX6ULL芯片介绍下载官网资料

参考&#xff1a;NXP I.MX6ULL芯片介绍以及资料的获取 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-09-26 10:54:26 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108808573 目录I.MX6ULL芯片介绍以及官网资料的获取I.MX6ULL芯片介绍以及…

变速不变调方法

语音变速不变调&#xff0c;即语音时长规整&#xff0c;是指不改变原说话人的音调及语义信息&#xff0c;只改变说话人的语速。 语音变速不变调算法有三大类&#xff1a;时域法、频域法、参量法&#xff0c;如表2-1所示。 表2-1 变速不变调算法分类 时域法 频域法 参量法 剪…

java开发高端说法_关于Java代码的设计和开发注意事项,下列哪些说法符合《集合开发规约》:...

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…

ES6学习笔记六(Iterator和for..of)

{let arr[hello,world];let maparr[Symbol.iterator](); //返回false时继续执行&#xff0c;true停止执行&#xff01;console.log(map.next());console.log(map.next());console.log(map.next()); }{let obj{start:[1,3,2],end:[7,8,9],[Symbol.iterator](){let selfthis;let…

判定点是否在不规则多边形内部的问题

2019独角兽企业重金招聘Python工程师标准>>> 问题如下&#xff1a; 话说在平面内有一个任意的不规则的封闭多边形&#xff0c;另外在这个平面内还有一个点&#xff0c;问题&#xff1a;如何高效的判定这个点是在这个多边形内部还是外部&#xff1f;补充&#xff1a…

Cortex-A7 MPCore 架构详细介绍(九种运行模式、内核寄存器组R0~R15,有特定的名字和功能)

目录0.ARM架构的历史简介1.Cortex-A7 MPCore(即多核) 简介2.Cortex-A 处理器九种运行模式3.Cortex-A 寄存器组&#xff08;内核寄存器&#xff09;3.1通用寄存器3.1.1未备份寄存器(R0~R7)3.1.2备份寄存器(R8~R12、SP指针R13、备份R14也叫LR)3.1.3程序计数器R15(PC)3.2程序状态寄…

Java开发中遇到具有挑战的事_Java并发编程的挑战:遇到的问题及如何解决

并发编程的目的是为了让程序运行得更快&#xff0c;但是&#xff0c;并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时&#xff0c;如果希望通过多线程执行任务让程序运行得更快&#xff0c;会面临非常多的挑战&#xff0c;比如上下文切换的问题、死锁的问…