[bzoj 4811] 由乃的OJ(贪心 + 树链剖分)

前置技能:[Noi2014]起床困难综合症。

不难看出,这道题其实就是上一道题的加强版
在上一道题中,因为位运算时位与位之间互不干扰
所以从高位到低位枚举初始值二进制上的每一位为0和为1时,经过n次计算后这一位的结果,贪心选取
在这题中,我们也可以用同样的思路求取答案
因为有树上路径查询,考虑树链剖分,用线段树维护每一位初始为0和1时,经过一个区间的计算变为多少
因为&、|、^ 运算都符合结合律,所以这样做是可行的
问题是,&、|、^ 运算并不都满足交换律,即每个区间从左到右计算和从右到左计算得到的结果是不同的
而在树上从x走到y的途中,并不保证一定按dfn序从小到大的顺序走
所以我们还要分别维护每个区间从左到右计算和从右到左计算的结果
另外,给每一位都开一颗线段树显然是不现实的,
考虑到 k<=64,我们使用状压,把所有位都压到一起,存到一颗线段树中(注意要开unsigned long long)

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=100010;
ull read(){ull x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
struct Edge{int u,v,nxt;
}edge[N<<1];
int head[N],cnt;
void addedge(int u,int v){edge[++cnt]=(Edge){u,v,head[u]};head[u]=cnt;edge[++cnt]=(Edge){v,u,head[v]};head[v]=cnt;
}
int n,m,k;
int dep[N],son[N],sz[N],top[N],fa[N],tid[N],rnk[N],ind;
void dfs1(int u,int f){fa[u]=f;dep[u]=dep[f]+1;sz[u]=1;for(int i=head[u];~i;i=edge[i].nxt) if(edge[i].v!=f){dfs1(edge[i].v,u);if(sz[edge[i].v]>sz[son[u]]) son[u]=edge[i].v;sz[u]+=sz[edge[i].v];}
}
void dfs2(int u,int tp){top[u]=tp;tid[u]=++ind;rnk[ind]=u;if(sz[u]>1) dfs2(son[u],tp);for(int i=head[u];~i;i=edge[i].nxt) if(edge[i].v!=son[u]&&edge[i].v!=fa[u])dfs2(edge[i].v,edge[i].v);
}
ull tran[N<<3][2][2];
//tran[o][0:带进0计算 ? 1:带进1计算][0:从左往右算 ? 1:从右往左算]
inline ull transf(ull a,ull b,int opt){if(opt==1){return a&b;}else if(opt==2){return a|b;}else return a^b;
}
int op;
inline ull transf(ull a,ull b){if(op==1){return a&b;}else if(op==2){return a|b;}else return a^b;
}
inline void pushup(int o){int ls=o<<1,rs=o<<1|1;tran[o][1][0]=(tran[ls][1][0]&tran[rs][1][0])|(~tran[ls][1][0]&tran[rs][0][0]);tran[o][1][1]=(tran[rs][1][1]&tran[ls][1][1])|(~tran[rs][1][1]&tran[ls][0][1]);tran[o][0][0]=(tran[ls][0][0]&tran[rs][1][0])|(~tran[ls][0][0]&tran[rs][0][0]);tran[o][0][1]=(tran[rs][0][1]&tran[ls][1][1])|(~tran[rs][0][1]&tran[ls][0][1]);
}
void update(int o,int l,int r,int x,ull k){if(l==r){tran[o][0][0]=tran[o][0][1]=transf(0ull,k);tran[o][1][0]=tran[o][1][1]=transf(~0ull,k);}else{int mid=l+r>>1;if(x<=mid) update(o<<1,l,mid,x,k);else update(o<<1|1,mid+1,r,x,k);pushup(o);  }
}
ull t1[2],t0[2];
int t;
void query(int o,int l,int r,int a,int b){if(a<=l&&b>=r){   if(!t){ull tt=t1[t];t1[t]=(tran[o][1][t]&t1[t])|(~tran[o][1][t]&t0[t]);t0[t]=(tran[o][0][t]&tt)|(~tran[o][0][t]&t0[t]);}else{t1[t]=(t1[t]&tran[o][1][t])|(~t1[t]&tran[o][0][t]);t0[t]=(t0[t]&tran[o][1][t])|(~t0[t]&tran[o][0][t]);     }}else{int mid=l+r>>1;if(b>mid) query(o<<1|1,mid+1,r,a,b);if(a<=mid) query(o<<1,l,mid,a,b);      }
}
ull val[N];
int opt[N];
void build(int o,int l,int r){if(l==r){   tran[o][0][0]=tran[o][0][1]=transf(0ull,val[rnk[l]],opt[rnk[l]]);tran[o][1][0]=tran[o][1][1]=transf(~0ull,val[rnk[l]],opt[rnk[l]]);}else{int mid=l+r>>1;build(o<<1,l,mid);build(o<<1|1,mid+1,r);pushup(o);}
}
ull z;
inline ull ask(int x,int y){t0[0]=t0[1]=0;t1[0]=t1[1]=~0ull;while(top[x]!=top[y]){if(dep[top[x]]>dep[top[y]]){t=1;query(1,1,n,tid[top[x]],tid[x]);x=fa[top[x]];}else{t=0;query(1,1,n,tid[top[y]],tid[y]);y=fa[top[y]];}}if(dep[x]>dep[y]){t=1;query(1,1,n,tid[y],tid[x]);     }else{t=0;query(1,1,n,tid[x],tid[y]);}ull T0=(t0[1]&t1[0])|(~t0[1]&t0[0]);ull T1=(t1[1]&t1[0])|(~t1[1]&t0[0]);ull v=0,ans=0;for(int i=k;~i;i--){ull v1=v|(1ull<<i);if(v1<=z){if(T0&(1ull<<i)||!(T1&(1ull<<i)))ans|=T0&(1ull<<i);else{ans|=T1&(1ull<<i);v|=(1ull<<i);}}else{ans|=T0&(1ull<<i);}}return ans;
}   
int main(){memset(head,cnt=-1,sizeof(head));n=read();m=read();k=read();k--;for(int i=1;i<=n;i++)opt[i]=read(),val[i]=read();for(int i=1;i<n;i++)addedge(read(),read());dfs1(1,1);dfs2(1,1);build(1,1,n);while(m--){int q=read(),x=read( ),y=read( );z=read( );if(q==1)  printf("%llu\n",ask(x,y));else{op=y;update(1,1,n,tid[x],z);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4055-[JSOI2009]游戏【网络流,博弈】

正题 题目链接:https://www.luogu.com.cn/problem/P4055 题目大意 n∗mn*mn∗m的网格有的不能走&#xff0c;走过的不能走。开始有一个棋子先手可以决定位置&#xff0c;然后后先手轮流走&#xff0c;不能走的就输了&#xff0c;求先手的必胜开始位置。 解题思路 我们将图二分…

【贪心】逃跑(jzoj 1748)

逃跑 jzoj 1748 题目大意 你有一个能量值l&#xff0c;在接下来的n天里&#xff0c;你每天有两个选择&#xff1a; 1、增加l个食物 2、使l加一&#xff0c; 你第i天要吃ai个a_i个ai​个食物&#xff0c;如果吃不到就会死掉&#xff0c;现在问你n天后你能活下去吗&#xff0c…

c#中关于协变性和逆变性(又叫抗变)帮助理解

今天回忆了之前看的《深入理解C#》这本书中的泛型章节&#xff0c;其中对泛型的可变性的理解。泛型可变性分两种&#xff1a;协变和逆变。逆变也又称为抗变。怎么理解这两个名词的意思&#xff1a;①&#xff1a;协变即为在泛型接口类型中使用out标识的类型参数。协变的字面意思…

「木」迷雾森林

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format:%lld 题目描述 赛时提示&#xff1a;保证出发点和终点都是空地 帕秋莉掌握了一种木属性魔法 这种魔法可以生成一片森林&am…

【单调队列】【DP】城市交通(jzoj 1749)

城市交通 jzoj 1749 题目大意 有n个点&#xff0c;x到y的前提是x<y,代价是(y−x)∗axby(y-x)*a_xb_y(y−x)∗ax​by​&#xff0c;问从1到n的最小代价是多少 输入样例 4 2 9 5 4 9 1 2 2输出样例 8数据范围 对于20%的数据&#xff0c;1⩽n⩽100&#xff1b;1\leqslan…

P5546-[POI2000]公共串【SAM】

正题 题面链接:https://www.luogu.com.cn/problem/P5546 题目大意 求nnn个串的最长公共子串。 解题思路 注意到最长公共子串一定是其中所有的子串&#xff0c;所以我们可以先随意对一个串构建SAMSAMSAM然后将信息存在上面即可。 然后每一个其他串都丢到那个SAMSAMSAM上跑匹…

C# 7.0中的解构功能---Deconstruct

解构元组C#7.0新增了诸多功能&#xff0c;其中有一项是新元组(ValueTuple)&#xff0c;它允许我们可以返回多个值&#xff0c;并且配合解构能更加方便的进行工作&#xff0c;如下面例子可以看到解构元组可以写出优雅的代码&#xff0c;并且可以使用类型推断&#xff0c;但在这里…

csp初赛复习(往年真题+解析)

排序算法 前缀/后缀表达式 二进制补码、反码 最短路 图片/音频/视频文件格式 前序/中序/后序遍历 以比较作为基本运算&#xff0c;在 N 个数中找最小数的最少运算次数为&#xff08; &#xff09;。 A. NNN B. N−1N-1N−1 C. N2N^2N2 D. logNlogNlogN 正确答案&#xff1a; B …

纪中B组模拟赛总结(2020.2.7)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3141414lyflyflyf190190190100100100909090000 总结 T1看了一会看出是二进制&#xff0c;就敲了出来 T2想不到正解&#xff0c;就敲了一个暴力&#xff0c;竟水到了90分&#xff0c;正解是要有撤回的贪心 T3以为…

CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】

正题 题面链接:https://www.luogu.com.cn/problem/CF932F 题目大意 nnn个点的一棵树&#xff0c;从xxx跳到yyy&#xff08;要求yyy在xxx的子树中&#xff09;会产生Ax∗ByA_x*B_yAx​∗By​的代价&#xff0c;求每个节点出发跳到某个叶节点的最小代价。 解题思路 考虑dpdpdp的…

ASP.NET Core 2.1中基于角色的授权

授权是来描述用户能够做什么的过程。例如&#xff0c;只允许管理员用户可以在电脑上进行软件的安装以及卸载。而非管理员用户只能使用软件而不能进行软件的安装以及卸载。它是独立的而又与验证配合使用&#xff0c;需要身份验证机制。对于应用程序来说&#xff0c;首先需要进行…

CF449B Jzzhu and Cities(Dijkstra)

设每个点到1的距离为dis[x]dis[x]dis[x],特殊边为(1,vi,wi)(1,v_i,w_i)(1,vi​,wi​) 1、wi>dis[vi]w_i>dis[v_i]wi​>dis[vi​]的特殊边可以删除 2、widis[vi]且num[vi]>1w_idis[v_i]且num[v_i]>1wi​dis[vi​]且num[vi​]>1,特殊边可以删掉 思路上的偏差&…

Sunscreen

来源&#xff1a;牛客网 Sunscreen 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must co…

【dfs】无穷迷宫(jzoj 3924)

无穷迷宫 jzoj 3924 题目大意 有一个n*m的迷宫&#xff0c;有墙&#xff08;#&#xff09;&#xff0c;路&#xff08;.&#xff09;&#xff0c;和你的位置&#xff08;S&#xff09;&#xff0c;这个迷宫会复制无数份拼在一起&#xff0c;问你能不能不停地走下去 输入样例…

[2020.11.27NOIP模拟赛]拼图王【dp】

正题 题面链接:https://www.luogu.com.cn/problem/U142584 题目大意 nnn个010101串&#xff0c;按顺序分成两个序列&#xff0c;然后拼接成一个序列&#xff08;拼接串x,yx,yx,y的话就是变成一个前缀包含xxx&#xff0c;后缀包含yyy的最短的串&#xff09;。求最短长度。 解题…

分布式事务一致性解决方案

一、从数据一致性谈起↑一致性问题&#xff0c;“万恶之源”是数据冗余和分布并通过网络交互网络异常是常态。1、数据一致性的情形主库、从库和缓存数据一致性&#xff0c;相同数据冗余&#xff0c;关系数据库&#xff0c;为保证关据库的高可用和高性能&#xff0c;一般会采用主…

hihocoder1147 时空阵(bfs树+DP)

bfs树中&#xff0c;边只存在于同一层或相邻层的点之间 设f[i][j][k]f[i][j][k]f[i][j][k]为前iii层一共使用jjj个节点&#xff0c;其中第iii层有kkk个节点的合法方案&#xff0c;转移枚举每一层的连边方式&#xff0c;做到第LLL层即可。对于LLL 层之后的边可以随便乱连。&…

牛客网【每日一题】4月21日题目精讲 糖糖别胡说,我真的不是签到题目

试题 糖糖别胡说&#xff0c;我真的不是签到题目 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 131072K&#xff0c; 其他语言262144K 64bit IO Format:%lld 题目描述 从前&#xff0c;有n只萌萌的糖糖&#xff0c;他们分成了两组一起玩游戏。…

近似乘积(jzoj 3925)

近似乘积 jzoj 3925 题目大意 给你一个集合A和n让你求不在集合A内的x、y、z&#xff0c;使∣n−xyz∣|n-xyz|∣n−xyz∣最小 输入样例 3 2 2 4 4 1 1 7 2 1 15 90输出样例 1 1 3 2 2 2 2 5 9数据范围 40% 的数据&#xff1a;1⩽m⩽10&#xff0c;1⩽n⩽100.1 \leqslant …

[2020.11.27NOIP模拟赛]中位数之中位数【二分,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/U142585?contestId37855 题目大意 nnn个数&#xff0c;求所有区间中位数的中位数。 解题思路 二分一个答案&#xff0c;然后如果一个区间的中位数≥mid\geq mid≥mid&#xff0c;那么这个区间一定是≥mid\geq mid≥mid的数比…