$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. ORACLE链接SQLSERVER数据库数据操作函数范例

    ORACLE链接SQLSERVER数据库数据操作函数范例 create or replace function FUN_NAME(LS_DJBH IN varchar2 ,LS_ITM varchar ...

  2. 【SQL Server数据迁移】32位的机器:SQL Server中查询ORACLE的数据

    从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 .64位的机器和软件,需要用不同的驱动程序来实现. 在32位的机器 ...

  3. Self-paced Clustering Ensemble自步聚类集成论文笔记

    Self-paced Clustering Ensemble自步聚类集成论文笔记 2019-06-23 22:20:40 zpainter 阅读数 174  收藏 更多 分类专栏: 论文   版权声明 ...

  4. Unity项目 - MissionDemolition 愤怒的小鸟核心机制

    目录 游戏原型 项目演示 绘图资源 代码实现 注意事项 技术探讨 参考来源 游戏原型 爆破任务 MissionDemolition 是一款核心机制类似于愤怒的小鸟的游戏,玩家将用弹弓发射炮弹,摧毁城堡 ...

  5. 扩展JS

    //JS的扩展方法: 1 定义类静态方法扩展 2 定义类对象方法扩展            var aClass = function(){} //1 定义这个类的静态方法            aC ...

  6. ④ Python3.0字符串

    字符串无论是python或者其他语言,是最常用的数据类型之一: 这儿注意在python中可以通过使用引号( ' 或 " )来创建字符串.使用三引号('''或""" ...

  7. 使用jQuery开发accordion手风琴插件

    一.插件效果 手风琴插件常用的功能均已实现,包括:手风琴菜单项的折叠展开效果.选中指定菜单项.判断菜单项是否选中等. 效果如下: 二.插件内部HTML元素结构 <!-- accordioon组件 ...

  8. 2.将多个元素设置为同一行?清除浮动有几种方式?【HTML】

    1.将多个元素设置为同一行:float,inline-block 清除浮动的方式: 方法一:添加新的元素 .应用 clear:both: 方法二:父级div定义 overflow: hidden: 方 ...

  9. 【雅思】【绿宝书错词本】List1~12

    List 1 ❤methane n.甲烷,沼气 ❤variety n.品种,种类:变化,多样化 ❤congratulate vt.祝贺 List 2 ✔denote v.表示,指示:意味着 ✔iris ...

  10. AE二次开发,解决子窗体使用父窗体的AxControl控件

    在子窗体写构造函数,然后再在父窗体按钮点击事件下写 public frmIDW(AxMapControl axMapControl1) { InitializeComponent(); this.ax ...