题目链接:https://nanti.jisuanke.com/t/31714

题意:给你一棵树,初始全为0,有四种操作:

1.u-v乘x    2.u-v加x   3. u-v取反  4.询问u-v的和

思路:

除去第三个操作就是很简单的树链剖分+线段树多重标记下放,所以我们只要考虑怎么维护第三个操作就好了,

由题目给的取反可知:!x =  (2^64-1) - x;   但是这样维护还是很麻烦,因为这道题是对2^64取模的,我们可以

尝试把这个式子转换成只有加法和乘法的,这样就可以将其和前面两个操作一起维护降低难度。

我们可以想到: (-x)%(2^64) = (2^64-1)*x%(2^64),那么式子就可以转换成:

!x = (2^64-1)*x + (2^64-1) 这样这个式子就只有乘法和加法操作,以及一个常数,然后带入多重标记维护就好了

数组要开 unsigned long long ,题目给的模数也很特殊,2^64, 因为unsigned long long 溢出的时候相当于对2^64

取模,那么我们就不需要取模操作了,直接运算就完事了。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
#define ll unsigned long long
const ll inf = ;
const int M = 2e5+; vector<int>g[M];
int n,cnt1,cnt,a[M];
int son[M],fa[M],head[M],siz[M],top[M],dep[M],tid[M];
ll sum[M<<],add[M<<],mul[M<<]; void dfs1(int u,int faz,int deep){
dep[u] = deep;
fa[u] = faz;
siz[u] = ;
for(int i = ;i < g[u].size();i++){
int v = g[u][i];
//cout<<v<<" ";
if(v != fa[u]){
dfs1(v,u,deep+);
siz[u] += siz[v];
if(son[u] == -||siz[v] > siz[son[u]])
son[u] = v;
}
}
} void dfs2(int u,int t){
top[u] = t;
tid[u] = ++cnt;
if(son[u] == -) return;
dfs2(son[u],t);
for(int i = ;i<g[u].size();i++){
int v = g[u][i];
if(v != son[u]&&v != fa[u])
dfs2(v,v);
}
} void pushup(int rt){
sum[rt] = sum[rt<<] + sum[rt<<|];
} void pushdown(int m,int rt){
add[rt<<] = add[rt<<]*mul[rt] + add[rt];
add[rt<<|] = add[rt<<|]*mul[rt]+add[rt];
mul[rt<<] = mul[rt<<]*mul[rt];
mul[rt<<|] = mul[rt<<|]*mul[rt];
sum[rt<<] = sum[rt<<]*mul[rt] + add[rt]*(m-(m>>));
sum[rt<<|] = sum[rt<<|]*mul[rt]+add[rt]*(m>>);
add[rt] = ; mul[rt] = ;
} void build(int l,int r,int rt){
add[rt] = ; mul[rt] = ;
if(l == r){
sum[rt] = ;
return;
}
mid;
build(lson); build(rson);
pushup(rt);
} void update(int L,int R,ll c,int v,int l,int r,int rt){
if(L <= l&&R >= r){
if(v == ){
sum[rt] = sum[rt]*c;
add[rt] = add[rt]*c;
mul[rt] = mul[rt]*c;
}
else if(v == ){
sum[rt] = sum[rt] + (ll)c*(r-l+);
add[rt] = add[rt]+c;
}
else if(v == ){
sum[rt] = inf*sum[rt] + (r-l+)*inf;
add[rt] = add[rt]*inf+inf;
mul[rt] *= inf;
}
return;
}
pushdown(r-l+,rt);
int m = (l + r) >> ;
if(L <= m) update(L,R,c,v,lson);
if(R > m) update(L,R,c,v,rson);
pushup(rt);
} ll query(int L,int R,int l,int r,int rt){
if(L <= l&&R >= r){
return sum[rt];
}
mid;
pushdown(r-l+,rt);
ll ret = ;
if(L <= m) ret += query(L,R,lson);
if(R > m) ret += query(L,R,rson);
return ret;
} void cover(int x,int y,ll c,int v){
int fx = top[x],fy = top[y];
while(fx!=fy){
if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
update(tid[fx],tid[x],c,v,,n,);
x = fa[fx];fx = top[x];
}
if(dep[x] < dep[y]) swap(x,y);
update(tid[y],tid[x],c,v,,n,);
} ll ask(int x,int y){ //求两结点路径上的权值和
int fx = top[x],fy = top[y];
ll ans = ;
while(fx != fy){
if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
ans += query(tid[fx],tid[x],,n,);
x = fa[fx]; fx = top[x];
}
ans += (dep[x] > dep[y])?query(tid[y],tid[x],,n,):query(tid[x],tid[y],,n,);
return ans;
} void init(){
cnt = cnt1 = ;
memset(son,-,sizeof(son));
dep[] = ; fa[] = ; siz[] = ;
} int main()
{
int x,q,op,l,r;
ll c;
while(scanf("%d",&n)!=EOF){
init();
// cout<<inf<<endl;
for(int i = ;i <= n;i ++){
scanf("%d",&x);
g[x].push_back(i);
}
dfs1(,,);
dfs2(,);
build(,n,);
scanf("%d",&q);
while(q--){
scanf("%d",&op);
if(op == ||op == ){
scanf("%d%d%llu",&l,&r,&c);
cover(l,r,c,op);
}
else if(op == ){
scanf("%d%d",&l,&r);
cover(l,r,,op);
}
else {
scanf("%d%d",&l,&r);
printf("%llu\n",ask(l,r));
}
}
for(int i = ;i <= n;i ++)
g[i].clear();
}
return ;
}

ACM-ICPC 2018 焦作赛区网络预赛 E Jiu Yuan Wants to Eat (树链剖分+线段树)的更多相关文章

  1. ACM-ICPC 2018 焦作赛区网络预赛 E. Jiu Yuan Wants to Eat (树链剖分-线性变换线段树)

    树链剖分若不会的话可自行学习一下. 前两种操作是线性变换,模\(2^{64}\)可将线段树全部用unsigned long long 保存,另其自然溢出. 而取反操作比较不能直接处理,因为其模\(2^ ...

  2. ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)

    There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...

  3. ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)

    God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...

  4. ACM-ICPC 2018 焦作赛区网络预赛

    这场打得还是比较爽的,但是队友差一点就再过一题,还是难受啊. 每天都有新的难过 A. Magic Mirror Jessie has a magic mirror. Every morning she ...

  5. ACM-ICPC 2018 焦作赛区网络预赛J题 Participate in E-sports

    Jessie and Justin want to participate in e-sports. E-sports contain many games, but they don't know ...

  6. ACM-ICPC 2018 焦作赛区网络预赛 K题 Transport Ship

    There are NN different kinds of transport ships on the port. The i^{th}ith kind of ship can carry th ...

  7. ACM-ICPC 2018 焦作赛区网络预赛 L 题 Poor God Water

    God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...

  8. ACM-ICPC 2018 焦作赛区网络预赛 I题 Save the Room

    Bob is a sorcerer. He lives in a cuboid room which has a length of AA, a width of BB and a height of ...

  9. ACM-ICPC 2018 焦作赛区网络预赛 H题 String and Times(SAM)

    Now you have a string consists of uppercase letters, two integers AA and BB. We call a substring won ...

随机推荐

  1. ESP8266开发综合篇(SDK开发-视频教程总揽)

    为了解决基础教程简单入门但不实用,项目方案非常实用但比较难的问题,开始推出8266开发综合篇 综合篇涉及到AT,LUA,SDK,LUA(sdk)开发,LUA和SDK开发会同步进行,后期再整理AT指令的 ...

  2. Java并发——线程中断学习

    1. 使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返 ...

  3. 【php增删改查实例】第二十节 - 把用户管理页面集成到main.php中

    把这个代码: <a href="javascript:openTab('用户管理','user/userManage.html ','icon-roleManage')" c ...

  4. cython学习

    学习网址:http://blog.csdn.net/i2cbus/article/details/23791309

  5. Linux系统特殊变量

    系统给定的特殊变量: 变量名 作用 $0 当前脚本的名字 $n 传递给脚本或者函数的参数,n表示第几个参数 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本或者函数 ...

  6. Munge服务部署和测试

    1. 概述2. 下载3. 安装3.1 源码简要说明3.2 编译安装3.3 配置3.4 创建munge.key3.5 启动方式 1. 概述 munge是认证服务,用于生成和验证证书.应用于大规模的HPC ...

  7. 免费的 Vue.js 入门与进阶视频教程

    这是我免费发布的高质量超清「Vue.js 入门与进阶视频教程」. 全网最好的.免费的 Vue.js 视频教程,课程基于 Vue.js 2.0,由浅入深,最后结合实际的项目进行了最棒的技术点讲解,此课程 ...

  8. 20min 快速着手Markdown

    目录 Markdown介绍和基本使用 初步介绍 markdown的使用场景 为什么是 Markdown markdown的基本语法和使用平台 Q&A: Markdown介绍和基本使用 初步介绍 ...

  9. python2.6升级到3.3.0 以及依赖库在迁移时的处理

    线上服务器python版本默认是2.6,由于业务程序要求,需要将python升级到3.3.0, 操作记录如下: Cenots6.8默认安装的是2.6版本,要更新升级需安装下gcc: [root@ope ...

  10. Pair Project 1 elevator

    结对编程——电梯调度 12061181 高孟烨 12061182 郝倩 1.结对编程的优缺点: 优点:结对编程可以结合两个人各自擅长之地,充分发挥两个人各自的优势,两个人一起合作效率会更高.一份工作两 ...