$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. Geoserver 跨域设置

    1.下载跨域jar包jetty-servlets.jar(下载geoserver使用的对应jetty版本——可以查看<Geoserver>\lib下jetty-servlet.jar的版本 ...

  2. SDOI2019 Round2

    这鬼家伙已经咕了好久了-- SDOIR2的题目挺好玩的- 快速查询(???) 不难发现所有的操作都可以通过区间打Tag实现 那么可以维护两个标记\(a,b\)表示序列中的数为\(x\)时实际表示的值是 ...

  3. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  4. MySql注释的写法

    每一种语言都有它的注释方式,代码量少的时候还可以,随着代码量越来越多,代码注释的重要性也越发凸显. 在mysql中主要有三种方式: 1.常用的方式,跟在css中那些注释一样 :/* 内容 */ /* ...

  5. javascript 数组排序原理的简单理解

    js内置的Array函数原型对象有个sort方法,这个方法能按照顺序排序数组. 例如: var arr1 = [6, 4, 2, 5, 2]; arr1.sort((x, y) => x - y ...

  6. LinuxKernel优秀博客

    1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5. ...

  7. robot framework笔记(三):扩展SeleniumLibrary库 (自定义关键字)

    (一)自定义和浏览器相关的关键字 以下代码GitHub 版本库地址: https://github.com/blairwind/blog_rf SeleniumLibrary的扩展文档中提供了3种增加 ...

  8. 【hadoop】在eclipse上运行WordCount的操作过程

    序:本以为今天花点时间将WordCount例子完全理解到,但高估自己了,更别说我只是在大学选修一学期的java,之后再也没碰过java语言了 总的来说,从宏观上能理解具体的程序思路,但具体到每个代码有 ...

  9. websocket趣说_转

    websocket协议:https://tools.ietf.org/html/rfc6455 作者:Ovear链接:https://www.zhihu.com/question/20215561/a ...

  10. 初学Django基础01 建立工程,目录结构,常用配置,上下文管理,模板渲染

    django是python的web重量级框架,发展已经有10年多了,对应下面版本 Django 版本 Python 版本 1.8 2.7, 3.2 , 3.3, 3.4, 3.5 1.9, 1.10 ...