树链剖分若不会的话可自行学习一下.

前两种操作是线性变换,模\(2^{64}\)可将线段树全部用unsigned long long 保存,另其自然溢出.

而取反操作比较不能直接处理,因为其模\(2^{64}\)的特殊性,可将其转化为线性变换.

显然

\[-x\equiv (2^{64}-1)*x (mod\ 2^{64})
\]

因为$$!x = (2^{64}-1) -x $$

所以

\[!x = (2^{64}-1) + (2^{64}-1)x
\]

#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define Lson l,m,lson
#define Rson m+1,r,rson
typedef unsigned long long LL;
LL TTT = 0xffffffffffffffff;
using namespace std;
const int maxn =1e5+5;
struct Edge{
int to,next;
}E[2*maxn];
int n,head[maxn],tot;
int cnt,idx,size[maxn],fa[maxn],son[maxn],dep[maxn],top[maxn],id[maxn],rnk[maxn]; void init()
{
cnt=idx=tot=0;
memset(head,-1,sizeof(head));
dep[1]=0,fa[1]=1,size[0]=0;
memset(son,0,sizeof(son));
} void AddEdge(int u,int v)
{
E[tot] = (Edge){v,head[u]};
head[u]=tot++;
}
void dfs1(int u)
{
size[u]=1;
for(int i=head[u];~i;i=E[i].next){
int v=E[i].to;
if(v!=fa[u]){
fa[v]=u;
dep[v]=dep[u]+1;
dfs1(v);
size[u]+=size[v];
if(size[son[u]]<size[v]) son[u]=v;
}
}
} void dfs2(int u,int topu)
{
top[u]= topu;
id[u] = ++idx;
rnk[idx] = u;
if(!son[u]) return;
dfs2(son[u],top[u]);
for(int i=head[u];~i;i=E[i].next){
int v=E[i].to;
if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
}
} struct Node{
LL sum,add,b;
bool nt;
}tree[maxn<<2];
void pushup(int rt){
tree[rt].sum = tree[lson].sum + tree[rson].sum;
} void pushdown(int l,int r,int rt)
{
int m = (l+r)>>1;
if(tree[rt].add!=1){
tree[lson].sum *= tree[rt].add;
tree[rson].sum *= tree[rt].add;
tree[lson].b *= tree[rt].add;
tree[rson].b *= tree[rt].add;
tree[lson].add *= tree[rt].add;
tree[rson].add *= tree[rt].add;
tree[rt].add = 1;
}
if(tree[rt].b){
tree[lson].sum += (m-l+1)* tree[rt].b;
tree[rson].sum += (r-m) *tree[rt].b;
tree[lson].b += tree[rt].b;
tree[rson].b += tree[rt].b;
tree[rt].b= 0;
}
} void build(int l,int r,int rt)
{
tree[rt].add =1;
tree[rt].b =0;
tree[rt].nt = 0;
if(l==r){
tree[rt].sum = 0;
return;
}
int m = (l+r)>>1;
build(Lson);
build(Rson);
pushup(rt);
} void update(int L,int R,LL k,LL b,int l=1,int r=n,int rt=1)
{
if(L<=l && R>=r){
tree[rt].sum *= k;
tree[rt].add *= k;
tree[rt].b *= k;
tree[rt].sum += (r-l+1)*b;
tree[rt].b +=b;
tree[rt].nt = 0;
return;
}
pushdown(l,r,rt);
int m = (l+r)>>1;
if(L<=m) update(L,R,k,b,Lson);
if(R>m) update(L,R,k,b,Rson);
pushup(rt);
} LL query(int L,int R,int l=1,int r= n,int rt=1)
{
if(L<=l && R>=r){
return tree[rt].sum;
}
pushdown(l,r,rt);
LL ans=0;
int m = (l+r)>>1;
if(L<=m) ans += query(L,R,Lson);
if(R>m) ans += query(L,R,Rson);
return ans;
} void change(int u,int v,int op,LL val)
{
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
if(op==1){
update(id[top[u]],id[u],(LL)1,val);
}
else if(op==2){
update(id[top[u]],id[u],val,0);
}
else{
update(id[top[u]],id[u],TTT,TTT);
}
u = fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
if(op==1){
update(id[u],id[v],(LL)1,val);
}
else if(op==2){
update(id[u],id[v],val,0);
}
else{
update(id[u],id[v],TTT,TTT);
}
return ;
} LL Qsum(int u,int v)
{
LL ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans += query(id[top[u]],id[u]);
u = fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ans += query(id[u],id[v]);
return ans;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int u,v,Q;
while(scanf("%d",&n)==1){
init();
for(int i=2;i<=n;++i){
scanf("%d",&u);
AddEdge(u,i);
AddEdge(i,u);
}
dfs1(1);
dfs2(1,1);
build(1,n,1);
scanf("%d",&Q);
int op;
LL tmp;
while(Q--){
scanf("%d",&op);
if(op==1){
scanf("%d %d %lld",&u, &v, &tmp);
change(u,v,2,tmp);
}
else if(op==2){
scanf("%d %d %llu",&u, &v,&tmp);
change(u,v,1,tmp);
}
else if(op==3){
scanf("%d %d",&u, &v);
change(u,v,3,0);
}
else{
scanf("%d %d",&u, &v);
printf("%llu\n",Qsum(u,v));
}
}
}
return 0;
}

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

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

    题目链接:https://nanti.jisuanke.com/t/31714 题意:给你一棵树,初始全为0,有四种操作: 1.u-v乘x    2.u-v加x   3. u-v取反  4.询问u-v ...

  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. 怎么绘制旋转Chem3D模型

    化学领域的专业人士常常需要绘制各种化学图形,特别是3D的图形,这个就需要用到一些化学绘图软件.Chem3D是ChemOffice的核心组件之一,可以绘制化学三维模型,包括新建.删除.旋转.移动等基础编 ...

  2. hdu 4715(打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4715 思路:先打个素数表,然后判断一下就可以了. #include<iostream> # ...

  3. spring配置文件头部配置解析

    http://blog.csdn.net/f_639584391/article/details/50167321

  4. Linux环境下Apache配置多个虚拟主机挂载多站点同时运行

    博客地址: http://blog.csdn.net/ClydeKuo/article/details/69569474 这篇博客讲的很详细,很详细.

  5. Hadoop1.2.1 HDFS原理

    基本以图片的形式呈现给大家: .

  6. DistroWatch评估XStream桌面153版本

    导读 XStreamOS是一个由Sonicle创建的Solaris的一个版本.XStream桌面将Solaris的强大带给了桌面用户,同时新手用户很可能有兴趣体验一下.DistroWatch对于XSt ...

  7. 160315、mybatis批量删除

    <deleteid="deleteCTQ" parameterType="java.lang.String"> DELETE FROM sqm_pr ...

  8. SharePoint Managed Metadata 使用总结

    前言 本文完全原创,转载请说明出处,希望对大家有用. 在SharePoint开发中,通常我们会将数据存储在列表,文档库或者直接存到数据库.但涉及到数据的层级结构时,用列表等存储实现并不是一件简单的事情 ...

  9. R语言中的聚类的使用

    这里的聚类主要用到K-Means和K-Medoide聚类.在进行聚类之前,为了避免不同参数之间量纲不同所造成的影响,先将数据进行(0-1)标准化 # 如参数weight data$weight < ...

  10. MySQL 监控指标

    为了排查问题,对数据库的监控是必不可少的,在此介绍下 MySQL 中的常用监控指标. 简介 MySQL 有多个分支版本,常见的有 MySQL.Percona.MariaDB,各个版本所对应的监控项也会 ...