ACM-ICPC 2018 焦作赛区网络预赛 E. Jiu Yuan Wants to Eat (树链剖分-线性变换线段树)
树链剖分若不会的话可自行学习一下.
前两种操作是线性变换,模\(2^{64}\)可将线段树全部用unsigned long long 保存,另其自然溢出.
而取反操作比较不能直接处理,因为其模\(2^{64}\)的特殊性,可将其转化为线性变换.
显然
\]
因为$$!x = (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 (树链剖分-线性变换线段树)的更多相关文章
- 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 ...
- ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)
There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...
- 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 ...
- ACM-ICPC 2018 焦作赛区网络预赛
这场打得还是比较爽的,但是队友差一点就再过一题,还是难受啊. 每天都有新的难过 A. Magic Mirror Jessie has a magic mirror. Every morning she ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- 【Python】用文本打印树
From:http://zhidao.baidu.com/link?url=O8U5TynGBMojDw2iFhlghPPf5_ZE1X8CAQMrK19pv-KxhvKCc6Z2yzsoQaukgN ...
- 在CentOS上安装Java环境
如何使用yum方式在CentOS上安装Java环境,系统以CentOS6.4为例. 工具/原料 Java JDK yum库 CentOS6.4 方法/步骤 1 查看CentOS自带JDK是否已安装. ...
- 《Programming with Objective-C》第五章 Customizing Existing Classes
1.分类里面只新增函数,不要新增变量:虽然新增是语法合法的,但是编译器并不会为你的property合成相应的成员变量.setter和getter Categories can be used to d ...
- 电脑端与iPad 端如何共享ChemDraw结构
在日常生活中,我们使用的电脑会有好几种系统,很多的软件不能做好各个系统的兼容.但是ChemDraw软件很好的解决了这个问题,可以应用于Mac.Windows两个电脑客户端以及Chem3D for iP ...
- Oracle的优化器的RBO和CBO方式
1.基于规则的优化方式(Rule-Based Optimization,简称为RBO) 优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则,对数据是不敏感的.它只借助少 ...
- [转]这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 深入了解Java之虚拟机内存
在讨论JVM内存区域分析之前,先来看一下Java程序详细运行的过程: -我们今天就来分析一下Java程序运行过程的-Runtime-Data-Area(运行时数据)-这一块" class=& ...
- Popwindow系列
一系列干货等你来拿 关于我:http://www.cnblogs.com/dubo-/ 项目中也有很多实用的事例,等待录入中...
- C++中的自动存储、静态存储和动态存储
根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆).在存在是间的长短方面,以这三种方式分配的数据对象各不相同.下面简要介绍这三种类型( ...
- 《jquery权威指南2》学习笔记------ jquery获取复选框的值
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...