Problem 7 树状数组+转化
$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 树状数组+转化的更多相关文章
- CF #261 div2 D. Pashmak and Parmida's problem (树状数组版)
Parmida is a clever girl and she wants to participate in Olympiads this year. Of course she wants he ...
- 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 ...
- 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预处理出 ...
- HDU 5296 Annoying problem LCA+树状数组
题解链接 Annoying problem Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- Pashmak and Parmida's problem(树状数组)
题目链接:http://codeforces.com/contest/459/problem/D 题意: 数列A, ai表示 i-th 的值, f(i,j, x) 表示[i,j]之间x的数目, 问:当 ...
- ZOJ 3157 Weapon --计算几何+树状数组
题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- POJ 3468 A Simple Problem with Integers(树状数组区间更新)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 97217 ...
- POJ3468 A Simple Problem with Interger [树状数组,差分]
题目传送门 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 1 ...
随机推荐
- Xshell连接虚拟机文档教程
1打开VirtualBox 2 找到导入的虚拟机 3右键虚拟机 启动 4 等待加载 5 加载的时候,打开xshell 6 7 填写框住的内容 名称: 自己取 主机: 127.0.0.1 固定内容 端 ...
- tkinter学习笔记_01
知识点目录: 1. 文本框 Label var = tk.StringVar() # 文本框 bg 背景颜色 fonnt 字体设置 width 长 height 高 l = tk.Label(root ...
- Bad state: Stream has already been listened to.
https://stackoverflow.com/questions/51396769/flutter-bad-state-stream-has-already-been-listened-to T ...
- 增强学习--TRPO算法
理论部分参考 推导 数学上的分析 代码
- 使用tmux管理终端的窗口
教程参考这里: http://louiszhai.github.io/2017/09/30/tmux/
- Spring Boot 笔记 (8) - H2 数据库
Maven 依赖 <dependency> <groupId>com.h2database</groupId> <artifactId>h2</a ...
- Python入门篇-基础语法
Python入门篇-基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编程基础 1>.程序 一组能让计算机识别和执行的指令. 程序 >.算法+ 数据结构= 程 ...
- css背景雪碧图等
1.背景图 雪碧图技术 要设置背景,是要设置在某个盒子上 <!doctype html> <html lang="en"> <head> < ...
- Linux系统运维相关的面试题 (问答题)
这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,希望要去参加Linux运维面试的朋友,可以先思考下这些问题. 一.Linux操作系统知识 1.常见的Linux发行版本都有 ...
- html实战
主要html源码 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...