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 ...
随机推荐
- [转]Loadrunner随机生成15位数字串
Loadrunner随机生成15位数字串 PS:http://www.51testing.com/html/43/6343-19789.html 今天看到一个网友的问题,是想生成一个15位的数字串来进 ...
- tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
转:tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案 检查tomcat与web工程对应版本,tomcat中对应版本的jar包拷贝到web工程 ...
- handlebars Helper用法
handlebars Helper用法: http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471357.html 逻辑运算符在handle ...
- 【BZOJ5083】普及 单调栈+二分+RMQ
[BZOJ5083]普及 Description 有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(从左到右或从右到左一个一个取出),使得 不管是从左往右还是从右往左取,都保证每时每刻 ...
- C 语言开发初涉-01 简单学习
尝试用C语言写windows程序: 简单的计算器 1.0版,仅用来熟悉C 开发windows的一些语法和语句用法 #include "stdafx.h" #include < ...
- Vue基础-作用域插槽-列表组件
Vue 测试版本:Vue.js v2.5.13 Vue 官网介绍作用域插槽时, 在 2.5.0+,slot-scope 能被用在任意元素或组件中而不再局限于 <template>. 作用域 ...
- dbForge mysql数据库比对
Comparison选项卡,新建一个表结构比较, (将source库的表结构变化应用到target库) 下面示例中,source用positec_uat, target用positec_pro ...
- Python全栈day14(字符串格式化)
一,%字符串格式化 1,使用%s 后面一一对应输入对应的字符串,%s可以接受任何参数 print ("I am %s hobby is zhangsan"%'lishi') pri ...
- c#自定义控件做漂亮的列表
效果图如下: 完整项目代码下载: 点击下载
- Windows平台下解决Oracle12c使用PDB数据库创建SDE的问题 分类: oracle sde 2015-06-12 11:03 88人阅读 评论(0) 收藏
Windows平台下解决Oracle12c使用PDB数据库创建SDE的问题 Oracle 12C中引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant ...