$des$
有一棵 $n$ 个点的以 $1$ 为根的树, 以及 $n$ 个整数变量 $x_i$ 。树上 $i$ 的父亲是 $f_i$ ,每条边 $(i,f_i)$ 有一

个权值 $w_i$ ,表示一个方程 $x_i + x_{f_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$.

$sol$
这是一道不错的题,转化后用数据结构维护。
这道题一眼看上去非常不可做
由于对 $x_1$ 进行查询,转化一下,就可以将每个变量都可以表示成 $x_i = k + x_1$ 或者 $x_i = k - x_1$ 的形式,表

示为这个形式之后就可以方便地回答询问了。
对于询问 $u,v,s,$ 只需要将表示 $u$ 和 $v$ 的式子加起来,
这时会出现两种情况:要么会得到 $x_u + x_v = t$ 的形式,此时只需要判断是否有 $s = t$;
要么会得到 $x_u + x_v = t + 2 \times x_1$ 或 $x_u + x_v = t - 2 \times x_1$ ,此时可以解出 $x_1$ ,

注意判断是

否解是整数即可。
对于修改操作,实际上是修改一个子树内的变量的 $k$ ,这里可以将深度为奇数和偶数的点
分开考虑,不难发现就是区间加减。由于只需要单点询问,用一个树状数组维护即可。

#include <bits/stdc++.h>

using namespace std;

#define gc getchar()
inline int read() {
int x = , f = ; char c = gc;
while(c < '' || c > '') {if(c == '-') f = -; c = gc;}
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x * f;
} #define LL long long
#define Rep(i, a, b) for(int i = a; i <= b; i ++) const int N = 1e6 + ; int n, fa[N];
vector <int> V[N];
int W[N], deep[N], lst[N], rst[N], tim; struct Bit {
int A[N]; inline int Lowbit(int x) {return x & (-x);} void Add(int x, int num) {
for(; x <= n; x += Lowbit(x)) A[x] += num;
} inline LL Calc(int x) {
LL ret = ;
for(; x; x -= Lowbit(x)) ret += A[x];
return ret;
}
} Tree; void Dfs(int u, int dep) {
deep[u] = dep;
lst[u] = ++ tim;
int S = V[u].size();
Rep(i, , S - ) {int v = V[u][i]; Dfs(v, dep ^ );}
rst[u] = tim;
} int main() {
n = read(); int q = read();
Rep(i, , n) {
fa[i] = read(), W[i] = read();
V[fa[i]].push_back(i);
} Dfs(, ); Rep(i, , n) if(!deep[i]) W[i] *= -;
Rep(i, , n) Tree.Add(lst[i], W[i]), Tree.Add(rst[i] + , -W[i]); Rep(qq, , q) {
int opt = read();
if(opt == ) {
int u = read(), v = read(), s = read();
LL x = Tree.Calc(lst[u]), y = Tree.Calc(lst[v]);
if(deep[u] && deep[v]) {
LL ret = x + y - s;
if(ret % == ) printf("%lld\n", ret >> );
else puts("none");
} else if(!deep[u] && !deep[v]) {
LL ret = x + y + s;
if(ret % == ) printf("%lld\n", ret >> );
else puts("none");
} else {
if(!deep[u]) swap(u, v), swap(x, y);
if(x - y == s) puts("inf");
else puts("none");
}
} else {
LL x = read(), now = read();
if(!deep[x]) now = -now;
Tree.Add(lst[x], now - W[x]), Tree.Add(rst[x] + , W[x] - now);
W[x] = now;
}
} return ;
}

Problem 7 树状数组+转化的更多相关文章

  1. CF #261 div2 D. Pashmak and Parmida&#39;s problem (树状数组版)

    Parmida is a clever girl and she wants to participate in Olympiads this year. Of course she wants he ...

  2. CF459D Pashmak and Parmida's problem (树状数组)

    Codeforces Round #261 (Div. 2)   题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a ...

  3. Codeforces Round #261 (Div. 2) D. Pashmak and Parmida's problem (树状数组求逆序数 变形)

    题目链接 题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a[j]),求i和j的种类数. 我们可以用map预处理出  ...

  4. HDU 5296 Annoying problem LCA+树状数组

    题解链接 Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  5. Pashmak and Parmida's problem(树状数组)

    题目链接:http://codeforces.com/contest/459/problem/D 题意: 数列A, ai表示 i-th 的值, f(i,j, x) 表示[i,j]之间x的数目, 问:当 ...

  6. ZOJ 3157 Weapon --计算几何+树状数组

    题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...

  7. 并查集&线段树&树状数组&排序二叉树

    超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...

  8. POJ 3468 A Simple Problem with Integers(树状数组区间更新)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 97217   ...

  9. POJ3468 A Simple Problem with Interger [树状数组,差分]

    题目传送门 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 1 ...

随机推荐

  1. JXOI2018

    发现自己不会T3可以退群了 排序问题(组合.模拟) 可以发现Gobo Sort相当于在所有排列中随机选择一个,所以当第\(i\)个数出现次数为\(a_i\)时,期望的Sort次数就是\(\frac{( ...

  2. Dubbo学习摘录(二)

    扩展点机制 扩展点的配置 (1)根据关键字读取配置,获取具体的实现类 比如在 dubbo-demo-provider.xml 文件中配置: 则会根据rmi去读取具体的协议实现类RmiProtocol. ...

  3. docker 入坑4

    搭建mongodb $ docker run --name mongo -it -d -p : -v ~/docker-data/mongo:/data/db -e MONGO_INITDB_ROOT ...

  4. .Net Core WebApi(1)— 入门

    主要讲述利用EF Core的CodeFirst迁移数据库,简单接口增删改查的使用,利用Swagger生成接口文档. 1.新建项目 创建DbContext 和实体模型

  5. 5_PHP数组_3_数组处理函数及其应用_3_数组指针函数

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组指针函数 1. key() 函数 程序: <?php $interests[2] = "mus ...

  6. 修复win10系统的引导

    上周末时,在安装完linux后,进入win10系统后,想做个系统的引导菜单,用了easyBCD,后来一不小心删除了win10的引导菜单(window boot manager). 这样,就造成了我wi ...

  7. iOS - 编译WebRTC.a静态库

    编译WebRTC.a静态库 编译的方式,我看了几个帖子,什么方法都有,这里我根据我的需求,说说我的做法.我的主要目的是因为网上找不到.a模式的webrtc的静态库,都是framework,所以我才自己 ...

  8. Django:ORM介绍

    1.ORM概念 ​ 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. ​ 简单的说,ORM是通过使用描述 ...

  9. UCOSIII信号量

    信号量通常分为两种 二进制信号量 计数型信号量 二进制信号量 二进制信号量只能取0和1两个值 计数型信号量 计数型信号量的范围由OS_SEM_CTR决定.OS_SEM_CTR可以为8位,16位和32位 ...

  10. UEditor 在 Layer 模态框中无法使用问题

    问题: 解决方法: 在 使用  ueditor 的页面顶部加入js代码: window.UEDITOR_HOME_URL = "__STATIC__/path/to/ueditor/&quo ...