传送门

考场上打了两个小时树剖,结果还是没搞出来

发现对于两个确定的点,它们一定可以列出一个方程来

其中系数的大小和正负只与这两点间距离的奇偶性有关

所以可以加一堆分情况讨论然后树剖

至于正解:

考虑两点之间的关系很麻烦,可以固定一个基准点,把它们都用 \(x_1\) 表示出来

  • 当需要极其麻烦地考虑两点之间的关系时,考虑固定一个基准点分别表示它们

发现这样的话对一个点的修改等价于把它的子树整体加上一个数

所以可以建立dfs序,直接树状数组维护,同样根据奇偶性判无解

Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 1000010
#define ll long long
//#define int long long char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
} int n, q;
int head[N], size, in[N], out[N], tot, val[N], dep[N], lim;
ll a[N<<1], b[N<<1];
struct edge{int to, next;}e[N];
inline void add(int s, int t) {e[++size].to=t; e[size].next=head[s]; head[s]=size;}
inline void upd(ll* a, int i, ll dat) {for (; i<=lim; i+=i&-i) a[i]+=dat;}
inline ll query(ll* a, int i) {ll ans=0; for (; i; i-=i&-i) ans+=a[i]; return ans;} void dfs(int u) {
in[u]=++tot;
upd(a, in[u], (dep[u]&1?-1:1)*val[u]);
upd(b, in[u], (dep[u]&1?1:-1)*val[u]);
for (int i=head[u]; ~i; i=e[i].next) dep[e[i].to]=dep[u]+1, dfs(e[i].to);
out[u]=++tot;
upd(a, out[u], (dep[u]&1?1:-1)*val[u]);
upd(b, out[u], (dep[u]&1?-1:1)*val[u]);
} signed main()
{
memset(head, -1, sizeof(head));
ll w; n=read(); q=read(); lim=n*2;
for (int i=2,u,w; i<=n; ++i) {
u=read(); w=read();
add(u, i); val[i]=w;
}
dep[1]=1; dfs(1);
for (int i=1,u,v,s,dlt; i<=q; ++i) {
if (read()&1) {
u=read(); v=read(); s=read();
//cout<<"uv: "<<u<<' '<<v<<endl;
w=query(dep[u]&1?b:a, in[u])+query(dep[v]&1?b:a, in[v])-s;
//cout<<"w: "<<w<<' '<<query(dep[u]&1?b:a, in[u])<<' '<<query(dep[v]&1?b:a, in[v])<<endl;
if (w&1) puts("none");
else if ((dep[u]&1?1:0)^(dep[v]&1?1:0)) puts(!w?"inf":"none");
else printf("%lld\n", (((dep[u]&1)&&(dep[v]&1))?-1:1)*(w>>1));
}
else {
u=read(); w=read();
dlt=w-val[u];
upd(a, in[u], (dep[u]&1?-1:1)*dlt);
upd(b, in[u], (dep[u]&1?1:-1)*dlt);
upd(a, out[u], (dep[u]&1?1:-1)*dlt);
upd(b, out[u], (dep[u]&1?-1:1)*dlt);
val[u]=w;
}
} return 0;
}

题解 Equation的更多相关文章

  1. [NOIP10.6模拟赛]2.equation题解--DFS序+线段树

    题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...

  2. Hdoj 2199.Can you solve this equation? 题解

    Problem Description Now,given the equation 8x^4 + 7x^3 + 2x^2 + 3x + 6 == Y,can you find its solutio ...

  3. The equation (扩展欧几里得)题解

    There is an equation ax + by + c = 0. Given a,b,c,x1,x2,y1,y2 you must determine, how many integer r ...

  4. Codeforces Little Dima and Equation 数学题解

    B. Little Dima and Equation time limit per test 1 second memory limit per test 256 megabytes input s ...

  5. csp-s模拟测试56Merchant, Equation,Rectangle题解

    题面:https://www.cnblogs.com/Juve/articles/11619002.html merchant: 二分答案,贪心选前m大的 但是用sort复杂度不优,会T掉 我们只是找 ...

  6. 2019牛客多校第九场B Quadratic equation(二次剩余定理)题解

    题意: 传送门 已知\(0 <= x <= y < p, p = 1e9 + 7\)且有 \((x+y) = b\mod p\) \((x\times y)=c\mod p\) 求解 ...

  7. CF20B Equation 题解

    Content 解方程 \(ax^2+bx+c=0\). 数据范围:\(-10^5\leqslant a,b,c\leqslant 10^5\). Solution 很明显上求根公式. 先来给大家推推 ...

  8. CF460B Little Dima and Equation (水题?

    Codeforces Round #262 (Div. 2) B B - Little Dima and Equation B. Little Dima and Equation time limit ...

  9. 《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题

    这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就 ...

随机推荐

  1. 保存TextBox中的文字为Path功能

    保存TextBox中的文字为Path功能 今天再设计一个我自己程序的Icon时使用了Path+textbox做了图形,我不想导出为PNG,因为颜色比较单一,我又想通过代码控制颜色,所以我想完整的保存为 ...

  2. Python 的上下文管理器是怎么设计的?

    花下猫语:最近,我在看 Python 3.10 版本的更新内容时,发现有一个关于上下文管理器的小更新,然后,突然发现上下文管理器的设计 PEP 竟然还没人翻译过!于是,我断断续续花了两周时间,终于把这 ...

  3. C语言相关知识

    1.指针:在程序中定义了一个变量,在进行编译时就会给该变量再内存中分配一个地址,通过访问这个地址可以找到所需变量,这个变量的地址成为该变量的指针.指针看作是内存中的一个地址,多数情况下,这个地址是内存 ...

  4. Docker 基础备忘录

    Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...

  5. Django基础-02篇 Models的属性与字段

    1.models字段类型 AutoField():一个IntegerField,根据可用ID自动递增.如果没指定主键,就创建它自动设置为主键. IntegerField():一个整数: FloatFi ...

  6. shell编程之循环语句for / while / until

    shell编程之循环语句与函数 一.条件测试 二.循环语句 ① for循环语句结构(遍历) 示例1 示例2 ② while循环语句结构(迭代) 示例1 示例2 ③ until 循环语句结构 示例1 一 ...

  7. 7Java基础补充

    1.标准Java bean写法 包括:private修饰的成员变量.getter和setter以及无参和有多个参数的有参构造方法 2.String原理 String底层是字节数组byte[]. Str ...

  8. Laravel 6 – 搭建管理后台的用户认证“脚手架”工具

    1. 下载Laravel/ui 命令: composer require laravel/ui "^1.0" -dev 注意laravel framework 6只支持版本1的la ...

  9. pip3 pip 安装包 临时更换镜像地址

    在使用pip3或者pip安装某些第三方包的时候,可能会遇到网络原因导致的安装失败. 可以在安装第三方包的时候临时指定镜像地址. 命令: pip3 install 库名 -i 镜像地址 例如:# pip ...

  10. GCD SUM

    GCD SUM 求 \[\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j) \] 将原式变换得到 \[\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{ ...