题目描述

You ye Jiu yuan is the daughter of the Great GOD Emancipator.  And when she becomes an adult, she will be queen of Tusikur, so she wanted to travel the world while she was still young. In a country, she found a small pub called Whitehouse. Just as she was about to go in for a drink, the boss Carola appeared. And ask her to solve this problem or she will not be allowed to enter the pub. The problem description is as follows:
There is a tree with n nodes, each node i contains weight a[i], the initial value of a[i] is 0.  The root number of the tree is 1. Now you need to do the following operations:
1) Multiply all weight on the path from u to v by x
2) For all weight on the path from u to v, increasing x to them
3) For all weight on the path from u to v, change them to the bitwise NOT of them
4) Ask the sum of the weight on the path from u to v
The answer modulo 2^64.

Jiu Yuan is a clever girl, but she was not good at algorithm, so she hopes that you can help her solve this problem. Ding~~~

The bitwise NOT is a unary operation that performs logical negation on each bit, forming the ones' complement of the given binary value. Bits that are 0 become 1, and those that are 1 become 0. For example:

NOT 0111 (decimal 7) = 1000 (decimal 8)
NOT 10101011 = 01010100

输入

The input contains multiple groups of data.
For each group of data, the first line contains a number of n, and the number of nodes.
The second line contains (n - 1) integers bi, which means that the father node of node (i +1) is bi.
The third line contains one integer m, which means the number of operations,
The next m lines contain the following four operations:
At first, we input one integer opt
1) If opt is 1, then input 3 integers, u, v, x, which means multiply all weight on the path from u to v by x
2) If opt is 2, then input 3 integers, u, v, x, which means for all weight on the path from u to v, increasing x to them
3) If opt is 3, then input 2 integers, u, v, which means for all weight on the path from u to v, change them to the bitwise NOT of them
4) If opt is 4, then input 2 integers, u, v, and ask the sum of the weights on the path from u to v

1 ≤ n, m, u, v ≤ 10^5
1 ≤ x < 2^64

输出

For each operation 4, output the answer.

样例输入

7
1 1 1 2 2 4
5
2 5 6 1
1 1 6 2
4 5 6
3 5 2
4 2 2
2
1
4
3 1 2
4 1 2
3 1 1
4 1 1

样例输出

5
18446744073709551613
18446744073709551614
0
题意
给一棵n个节点的有根树,每个节点有权值,初始是0,m次操作
u v x:给u v路径上的点权值*x
u v x:给u v路径上的点权值+x
u v:给u v路径上的点权值取反
u v:询问u v路径上的权值和,对2^64取模 树链剖分:https://wenku.baidu.com/view/a088de01eff9aef8941e06c3.html 然后如果没有取反操作,线段树维护和sum,加法标记add和乘法标记mul即可
对于取反操作,因为是对2^64取模的,即x+(!x)=^-,所以x=(^-)-x,因此取反就变成乘法和加法了:!x=(-)*x+(-) (-1对于2^64取模后是(^-))
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=1e5+;
int n,m,tot,cnt;
int fa[N],last[N];
int son[N],deep[N],dfn[N],num[N],top[N];//重儿子 深度 dfs序 子树规模 所在重链的顶端节点
ull sum[N*],add[N*],mul[N*];
struct orz{
int v,nex;}e[N];
void init()
{
cnt=;
tot=;
memset(last,,sizeof(last));
memset(son,-,sizeof(son));
}
void Inses(int x,int y)
{
cnt++;
e[cnt].v=y;
e[cnt].nex=last[x];
last[x]=cnt;
}
void dfs1(int x,int d)
{
deep[x]=d;
num[x]=;
for (int i=last[x];i;i=e[i].nex)
{
int v=e[i].v;
dfs1(v,d+);
num[x]+=num[v];
if (son[x]==- || num[v]>num[son[x]]) son[x]=v;
}
}
void dfs2(int x,int sp)
{
top[x]=sp;
dfn[x]=++tot;
if (son[x]==-) return ;
dfs2(son[x],sp);
for (int i=last[x];i;i=e[i].nex)
{
int v=e[i].v;
if (v!=son[x]) dfs2(v,v);
}
}
void PushUp(int s)
{
sum[s]=sum[s<<]+sum[s<<|];
}
void PushDown(int s,int l,int r)
{
if (mul[s]!=)
{
mul[s<<]*=mul[s];
mul[s<<|]*=mul[s];
add[s<<]*=mul[s];
add[s<<|]*=mul[s];
sum[s<<]*=mul[s];
sum[s<<|]*=mul[s];
mul[s]=;
} if (add[s])
{
add[s<<]+=add[s];
add[s<<|]+=add[s];
int mid=(l+r)>>;
sum[s<<]+=(ull)(mid-l+)*add[s];
sum[s<<|]+=(ull)(r-mid)*add[s];
add[s]=;
}
} void build(int s,int l,int r)
{
sum[s]=add[s]=;
mul[s]=;
if (l==r) return ;
int m=(l+r)>>;
build(s<<,l,m); build(s<<|,m+,r);
PushUp(s);
}
void update(int s,int l,int r,int L,int R,ull val,int op)
{
//printf("s=%d,l=%d,r=%d,L=%d,R=%d\n",s,l,r,L,R);
if (L<=l&&r<=R)
{
if (l!=r) PushDown(s,l,r);
if (op==)
{
mul[s]*=val;
add[s]*=val;
sum[s]*=val;
}
else if (op==)
{
add[s]+=val;
sum[s]+=(ull)(r-l+)*val;
}
else
{
mul[s]*=val;
add[s]*=val;
add[s]+=val;
sum[s]=(ull)(r-l+)*val-sum[s];
}
return;
}
PushDown(s,l,r);
int mid=(l+r)>>;
if (L<=mid) update(s<<,l,mid,L,R,val,op);
if (R>mid) update(s<<|,mid+,r,L,R,val,op);
PushUp(s);
}
ull query(int s,int l,int r,int L,int R)
{
if (L<=l&&r<=R) return sum[s];
PushDown(s,l,r);
int mid=(l+r)>>;
ull ans=;
if (L<=mid) ans+=query(s<<,l,mid,L,R);
if (R>mid) ans+=query(s<<|,mid+,r,L,R);
PushUp(s);
return ans;
}
void solve(int op,int x, int y,ull val)
{
if (op==) val=-;
if (op<=)
{
while (top[x]!=top[y])
{
if (deep[top[x]]<deep[top[y]]) swap(x, y);
update(,,n,dfn[top[x]],dfn[x],val,op);
x=fa[top[x]];
}
if (deep[x]>deep[y]) swap(x,y);
update(,,n,dfn[x],dfn[y],val,op);
}
else
{
ull ans=;
while (top[x]!=top[y])
{
if (deep[top[x]]<deep[top[y]]) swap(x, y);
ans+=query(,,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if (deep[x]>deep[y]) swap(x,y);
ans+=query(,,n,dfn[x],dfn[y]);
printf("%llu\n",ans);
}
} int main()
{
while (scanf("%d",&n)!=EOF)
{
init();
for (int i=;i<=n;i++)
{
scanf("%d",&fa[i]);
Inses(fa[i],i);
}
dfs1(,);
dfs2(,);
build(,,n);
scanf("%d",&m);
int op,u,v; ull x;
while (m--)
{
scanf("%d",&op);
if (op== || op==) scanf("%d%d%llu",&u,&v,&x);
else scanf("%d%d",&u,&v);
solve(op,u,v,x);
}
}
return ;
}
 

2018焦作网络赛-E- Jiu Yuan Wants to Eat的更多相关文章

  1. 2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat

    题意:四个操作,区间加,区间每个数乘,区间的数变成 2^64-1-x,求区间和. 题解:2^64-1-x=(2^64-1)-x 因为模数为2^64,-x%2^64=-1*x%2^64 由负数取模的性质 ...

  2. 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 ...

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

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

  4. 2018焦作网络赛Mathematical Curse

    题意:开始有个数k,有个数组和几个运算符.遍历数组的过程中花费一个运算符和数组当前元素运算.运算符必须按顺序花费,并且最后要花费完.问得到最大结果. 用maxv[x][y]记录到第x个元素,用完了第y ...

  5. 2018焦作网络赛Give Candies

    一开始忽略了欧拉定理指数部分是modphi(n-1)没有memset,减法后面没加0:

  6. 2018焦作网络赛 - Poor God Water 一道水题的教训

    本题算是签到题,但由于赛中花费了过多的时间去滴吧格,造成了不必要的浪费以及智商掉线,所以有必要记录一下坑点 题意:方格从1到n,每一格mjl可以选择吃鱼/巧克力/鸡腿,求走到n格时满足 1.每三格不可 ...

  7. ACM-ICPC 2018 焦作网络赛

    题目顺序:A F G H I K L 做题链接 A. Magic Mirror 题意:判断 给出的 字符串 是否等于"jessie",需要判断大小写 题解:1.用stl库 tolo ...

  8. 2018 焦作网络赛 K Transport Ship ( 二进制优化 01 背包 )

    题目链接 题意 : 给出若干个物品的数量和单个的重量.问你能不能刚好组成总重 S 分析 : 由于物品过多.想到二进制优化 其实这篇博客就是存个二进制优化的写法 关于二进制优化的详情.百度一下有更多资料 ...

  9. 2018 焦作网络赛 G Give Candies ( 欧拉降幂 )

    题目链接 题意 : 给出 N 个糖果.老师按顺序给 1~N 编号的学生分配糖果.每个学生要么不分.要么最少分一个.且由于是按顺序发放.那么对于某个有分到糖果的编号为 i 的学生.则 1~(i-1) 这 ...

随机推荐

  1. 【转】IntelliJ IDEA 2016.1.3注册破解激活

    http://blog.csdn.net/c1481118216/article/details/51773674

  2. spring整合mybatis后,mybatis一级缓存失效的原因

    一般来说,可以在5个方面进行缓存的设计: 最底层可以配置的是数据库自带的query cache, mybatis的一级缓存,默认情况下都处于开启状态,只能使用自带的PerpetualCache,无法配 ...

  3. SecureCRT安装,服务器远程连接客户端SSH

    SSH: Secure Shell 的缩写,是用来连接Linux服务器系统的软件.   它可以同时创建多个连接,方便对服务器的操作使用,界面也比Linux系统好看的多,同时安装一些必备的软件能更加方便 ...

  4. windows7下搭建robot framework环境

    第一步 安装python并设置环境变量 1.安装python: python下载地址https://www.python.org/,建议用2.7.x版本 2.设置环境变量: 方法如下所示  第二步 安 ...

  5. Codeforces 364D 随机算法

    题意:给你一个序列,定义ghd为一个序列中任意n / 2个数的gcd中最大的那个,现在问这个序列的ghd为多少. 思路:居然是论文题...来自2014年国家集训队论文<随机化算法在信息学竞赛中的 ...

  6. css3 序列帧动画抖动

    页面需要一个动画,设计师给了动画的序列帧 项目由vue构建,使用css3做动画 html <div class="work_two_main"></div> ...

  7. 关于LCN分布式事务框架

    基于LCN框架解决分布式事务 LCN官网 https://www.txlcn.org/ "LCN并不生产事务,LCN只是本地事务的搬运工" 兼容 dubbo.springcloud ...

  8. java基础学习笔记三(多态)

    多态? 多态是同一个行为具有多个不同表现形式或形态的能力. 存在的必要条件 继承 重写 父类引用指向子类对象 比如: Parent p = new Child(); 当使用多态方式调用方法时,首先检查 ...

  9. openwrt 编译支持sqlite3

    编译版本加载lib库 ------------------------------Libraries----------------------------------- Filesystem  -- ...

  10. MariaDB 管理

    在尝试运行MariaDB之前,首先确定其当前状态,运行或关闭. 有三个选项用于启动和停止MariaDB - 运行mysqld(MariaDB脚本). 运行mysqld_safe启动脚本. 运行mysq ...