2018ICPC网络赛(焦作站)E题题解
一、题目链接
二、题意
给定一棵树,有四种操作:
$1\ u\ v\ x$:把节点$u$到$v$路径上的所有点的权值乘以$x$;
$2\ u\ v\ x$:把节点$u$到$v$路径上的所有点的权值加上$x$;
$3\ u\ v$:把节点$u$到$v$路径上的所有点的权值取反(~操作);
$4\ u\ v$:查询节点$u$到$v$路径上的所有点的权值和;
所有操作都需要$mod\ 2^{64}$。
三、思路
操作1、2和4是很裸的树链剖分。关键是操作3。这里有个小技巧:对任意一个数字$x$取反,都等于$-(x+1)$。对于此题的$unsigned\ long\ long$类型,同样适用($-1$就是$1111\cdots1111_{(2)}=2^{64}-1$)。明白这个以后,取反操作可以变成加法和乘法。
然后要注意的是,线段树的区间加和区间乘的顺序问题,这里也有个技巧:如果区间$[l,r]$之前的和是$sum$,这个区间先加了一个$x$,再乘了一个$y$,那么可以变成$sum*y+x*y$。即让这个区间先乘一个$y$,再加上$x*y$。这样就可以保证以先乘后加的顺序不出问题了。
然后这题就愉快地AC了。
结论:对任意一个数$x$取反,无论这个数的类型是什么($int,unsigned\ int,long\ long,unsigned\ long\ long$都可以),都等于$-(x+1)$。
四、代码
#include<bits/stdc++.h> using namespace std; #define MAXN 100010 typedef unsigned long long ULL; struct edge { int to, next; edge(, ): to(to), next(next) {} } es[MAXN * ]; int head[MAXN], ecnt; int f[MAXN], deep[MAXN], siz[MAXN], zson[MAXN], top[MAXN], o2n[MAXN], dfscnt; int n, q; ULL a[MAXN]; namespace st { struct node { ULL sum, slazy, plazy; node(ULL a1 = , ULL a2 = , ULL a3 = ): sum(a1), slazy(a2), plazy(a3) {} } ns[MAXN * ]; void init() { , t = * n + ; i < t; ++i)ns[i] = node(, , ); } void pushdown(int rt, int l, int r) { , rch = rt << | , mid = (l + r) >> ; || ns[rt].plazy != ) { ns[lch].sum = ns[lch].sum * ns[rt].plazy + (mid - l + ) * ns[rt].slazy; ns[rch].sum = ns[rch].sum * ns[rt].plazy + (r - mid) * ns[rt].slazy; ns[lch].plazy *= ns[rt].plazy; ns[rch].plazy *= ns[rt].plazy; ns[lch].slazy = ns[lch].slazy * ns[rt].plazy + ns[rt].slazy; ns[rch].slazy = ns[rch].slazy * ns[rt].plazy + ns[rt].slazy; ns[rt].plazy = , ns[rt].slazy = ; } } , , int r = n) { if(l > ur || r < ul)return; if(l >= ul && r <= ur) { )ns[rt].sum += x * ULL(r - l + ), ns[rt].slazy += x; else ns[rt].sum *= x, ns[rt].plazy *= x, ns[rt].slazy *= x; return; } pushdown(rt, l, r); ; , l, mid); | , mid + , r); ns[rt].sum = ns[rt << ].sum + ns[rt << | ].sum; } ULL query(, , int r = n) { if(l > qr || r < ql)return 0LL; if(l >= ql && r <= qr)return ns[rt].sum; pushdown(rt, l, r); ; ULL res = ; , l, mid); | , mid + , r); return res; } }; void add(int from, int to) { es[++ecnt] = edge(to, head[from]), head[from] = ecnt; } void init() { memset(head, , ]) * (n + )); ecnt = ; memset(zson, , ]) * (n + )); dfscnt = ; st::init(); } void dfs1(int root, int par) { deep[root] = deep[par] + , f[root] = par, siz[root] = ; ; for(int i = head[root]; i; i = es[i].next) { int to = es[i].to; if(to != par) { dfs1(to, root); siz[root] += siz[to]; if(ms < siz[to]) { ms = siz[to], zson[root] = to; } } } } void dfs2(int root, int par, int tp) { top[root] = tp, o2n[root] = ++dfscnt; st::update(dfscnt, dfscnt, a[root], ); if(!zson[root])return; dfs2(zson[root], root, tp); for(int i = head[root]; i; i = es[i].next) { int to = es[i].to; if(to != par && to != zson[root]) { dfs2(to, root, to); } } } void update(int u, int v, ULL x, int type) { int tu = top[u], tv = top[v]; while(tu != tv) { if(deep[tu] >= deep[tv]) { st::update(o2n[tu], o2n[u], x, type); u = f[tu], tu = top[u]; } else { st::update(o2n[tv], o2n[v], x, type); v = f[tv], tv = top[v]; } } if(o2n[u] <= o2n[v])st::update(o2n[u], o2n[v], x, type); else st::update(o2n[v], o2n[u], x, type); } ULL query(int u, int v) { int tu = top[u], tv = top[v]; ULL res = ; while(tu != tv) { if(deep[tu] >= deep[tv]) { res += st::query(o2n[tu], o2n[u]); u = f[tu], tu = top[u]; } else { res += st::query(o2n[tv], o2n[v]); v = f[tv], tv = top[v]; } } if(o2n[u] <= o2n[v])res += st::query(o2n[u], o2n[v]); else res += st::query(o2n[v], o2n[u]); return res; } int main() { // freopen("e.in","r",stdin); int fa, op, u, v; ULL x; while(~scanf("%d", &n)) { init(); ; i <= n; ++i) { scanf("%d", &fa); add(fa, i), add(i, fa); } dfs1(, ); dfs2(, , ); scanf("%d", &q); while(q--) { scanf("%d", &op); ) { scanf("%d%d%llu", &u, &v, &x); update(u, v, x, ); } ) { scanf("%d%d%llu", &u, &v, &x); update(u, v, x, ); } ) { scanf("%d%d", &u, &v); update(u, v, , ); update(u, v, -, ); } else { scanf("%d%d", &u, &v); ULL res = query(u, v); printf("%llu\n", res); } } } ; }
2018ICPC网络赛(焦作站)E题题解的更多相关文章
- 2018ICPC网络赛(焦作站)K题题解
一.题目链接 https://nanti.jisuanke.com/t/31720 二.题意 给$N$种船只,第$i$种船的载重量是$V_i$,数量是$2^{C_i}-1$.接下来有$Q$次询问,每次 ...
- 2018ICPC网络赛(徐州站)A题题解
一.题目链接 https://nanti.jisuanke.com/t/31453 二.题意 给定$N$个位置,$2^k$种颜色,让你去涂色,条件是相邻的两种颜色类型异或值的二进制表示不全为$1$(以 ...
- 2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1 ...
- 2019CCPC网络预选赛 八道签到题题解
目录 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 6702 & 6703 array 6704 K-th occurrence 6705 path 6706 huntian o ...
- HDU 4730 We Love MOE Girls (2013成都网络赛,签到水题)
We Love MOE Girls Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- SCNU省选校赛第二场B题题解
今晚的校赛又告一段落啦,终于"开斋"了! AC了两题,还算是满意的,英语还是硬伤. 来看题目吧! B. Array time limit per test 2 seconds me ...
- Building Fire Stations 39届亚洲赛牡丹江站B题
题意: 给你一棵树,让你再里面选取两个点作为**点,然后所有点的权值是到这两个点中最近的那个的距离,最后问距离中最长的最短是多少,输出距离还有那两个点(spj特判). 思路: 现场 ...
- hdu 5038 (2014北京网络赛G 排序水题)
题意:有n个数字,带入10000 - (100 - ai) ^ 2公式得到n个数,输出n个数中频率最大的数,如果有并列就按值从小到大都输出输出,如果频率相同的数字是全部的n个数,就输出Bad....题 ...
- 2018ACM-ICPC亚洲区域赛南京站I题Magic Potion(网络流)
http://codeforces.com/gym/101981/attachments 题意:有n个英雄,m个敌人,k瓶药剂,给出每个英雄可以消灭的敌人的编号.每个英雄只能消灭一个敌人,但每个英雄只 ...
随机推荐
- 漂亮的各种弹出框 sweet alert
Sweet Alert 是一个替代传统的 Alert 的提示效果.SweetAlert 自动居中对齐在页面中央,不管您使用的是台式电脑,手机或平板电脑看起来效果都很棒. 还带下拉 几种 动画效果 弹窗 ...
- windows server 账号克隆
在dos命令行下隐藏用户的方法: net user 账户 密码 /add 如果在账号后加 $ 符号 这个账户在cmd命令行下是无法看见的 首先我们设置注册表权限 cmd = > regedt ...
- OC基础:内存(进阶):retain.copy.assign的实现原理 分类: ios学习 OC 2015-06-26 17:36 58人阅读 评论(0) 收藏
遍历构造器的内存管理 a.遍历构造器方法内部使用autorelease释放对象 b.通过遍历构造器生成的对象.不用释放. 内存的管理总结 1.想占用某个对象的时候,要让它的引用计数器+1(retain ...
- RCNN、SPP-net、Fast-RCNN和Faster-RCNN
RCNN RCNN (Regions with CNN features) 的核心思想是把图像划分成N(2000)个独立的区域,分别提取每个区域的CNN特征,然后把这些特征使用SVM等分类器进行结果预 ...
- Mac OS 基于 VirtualEnv 的安装 tensorflow 1.3.0
如果不行的话,就用conda装吧 https://www.jianshu.com/p/d54546ab315e 推荐使用 virtualenv 创建一个隔离的容器, 来安装 TensorFlow. 这 ...
- HPU 1127:【C语言程序设计】[7.4.2]最大元素(排序)
[C语言程序设计][7.4.2]最大元素 时间限制: 1 Sec 内存限制: 128 MB提交: 386 解决: 139 题目描述 编一个程序,读入n个元素的实型数组,然后调用一个函数,递归地找出其中 ...
- 原子性、可见性、synchronized 有好理解
原子性.可见性.synchronized 有好理解: from: https://blog.csdn.net/wohaqiyi/article/details/67635010 1.原子性 (1)原子 ...
- mac上textstudio在系统升级以后不能编译
不能工作的最主要原因为:os x改变了文件存放的路径.因此,需要修改setting中的command的路径,将原来的改为: /usr/local/texlive/2015/bin/x86_64-dar ...
- python 2个dict如何合并
dictMerged2 = dict( dict1, **dict2 ) 这种效率比较高 refer to: http://www.pythoner.com/13.html
- js操作链接url
使用js对当前的URL进行操作,可以使用内置对象window.location: window.location有以下属性: window.location.href:取得当前地址栏中的完整URL,可 ...