传送门

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

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

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

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

至于正解:

考虑两点之间的关系很麻烦,可以固定一个基准点,把它们都用 \(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. Java8实战——自己的总结

    java8 介绍   java8是2014年3月份,由Oracle发布的一个版本,又称之为jdk1.8,是现再我们在学习和工作中用的最多的一个版本.   在jdk1.8中,java8以添加非常多的新特 ...

  2. DHCP工作原理

    DHCP:Dynamic Host Configurtion Protocol DHCP的工作原理(UDP) 1.客户端:首先会发送给一个dhcp discovery(广播)报文,报文中的2层和3层都 ...

  3. layim即时通讯实例各功能整合

    一.系统演示1.1 聊天窗体主界面演示 1.2 模拟两人在线聊天(点击图片查看演示视频) 1.3 在线演示> 在线演示,点击进入系统到这里,若是您想要的,接下来听我娓娓道来二.开发工具开发软件: ...

  4. PYTHON UNRAR

    下载安装VINRAR 安装上面的下载文件 安装位置:32位具体位置 C:\Program Files (x86)\UnrarDLL      64位具体位置:C:\Program Files (x86 ...

  5. 锐捷RG-S2951G-EV3 ACL 禁止端口

    (config)ip access-list extended 199 (config)10 deny tcp any any eq 2425 (config)20 deny udp any any ...

  6. PyCharm代码区不能编辑的解决办法

    问题: 修改之前的Python代码时发现代码区无法编辑,无意中输入i后又可以编辑了. 解决: 原因是打开了工具中的vim Emulator编辑模式,把vim Emulator前面的勾取消即可.

  7. 常用的jquery加载后执行的写法

    (function(doc){ })(document); $(function(){ }) jQuery(function(){ }) $(document).ready(function(){ } ...

  8. 前端开发入门到进阶第三集【JavaScript中如何将html字符串转化为Jquery对象或者Dom对象】

    https://www.cnblogs.com/mingjiatang/p/4746845.html

  9. Requests方法 -- 参数化

    import requests#禁用安全请求警告from requests.packages.urllib3.exceptions import InsecureRequestWarningreque ...

  10. 用好Git stash,助你事半功倍

    git stash: 用法:git stash list [<选项>] 或:git stash show [<选项>] [<stash>] 或:git stash ...