bzoj 2908. 又是nand(树链剖分+区间NAND+单点修改)

首先考虑问题的简化版
存在下面两个操作

  • 询问[l,r][l,r][l,r]区间与非的值即alNANDal+1NAND…NANDara_l \text{NAND} a_{l+1} \text{NAND}\dots \text{NAND} a_ralNANDal+1NANDNANDar
  • 单线修改p,xp,xp,xap=xa_p=xap=x

这是一道去年校赛题最近才发现区间与非的板子题

首先直觉告诉我们要用线段树维护此操作,但是区间与非没有结合律,这样的信息线段树不能直接维护,不过位运算具有独立性,我们可以一位一位去考虑。

考虑用线段树每个节点维护L[0/1],R[0/1]\text{L}[0/1],\text{R}[0/1]L[0/1],R[0/1]

L[0]\text{L}[0]L[0]表示刚开是000,然后从左向右经过此区间是最终的数(此节点维护的区间)
L[1]\text{L}[1]L[1]表示刚开是111,然后从左向右经过此区间是最终的数
R[0]\text{R}[0]R[0]表示刚开是000,然后从右向左经过此区间是最终的数
R[1]\text{R}[1]R[1]表示刚开是111,然后从右向左经过此区间是最终的数

然后只需要维护32棵线段树(按位),就可以区间询问了。

2908. 又是nand

而此题就是套了个树链剖分,并且注意询问的时候有的区间是从左向右,有的区间是从右向左(yy一下树剖的样子即可)

#include<bits/stdc++.h>
using namespace std;
using u32=unsigned int;
using pii=pair<int,int>;
constexpr int N=100010;
int n,m,bit;
u32 a[N];
int h[N],e[2*N],ne[2*N],idx;
int sz[N],son[N],fa[N],dep[N];
int dfn[N],top[N],id[N],timestamp;
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;}
struct Segment
{struct node{int l,r;bool L[2],R[2];}tree[N<<2];void pushup(int u){tree[u].L[0]=tree[u<<1|1].L[tree[u<<1].L[0]];tree[u].L[1]=tree[u<<1|1].L[tree[u<<1].L[1]];tree[u].R[0]=tree[u<<1].R[tree[u<<1|1].R[0]];tree[u].R[1]=tree[u<<1].R[tree[u<<1|1].R[1]];}void build(int u,int l,int r,int k){tree[u].l=l,tree[u].r=r;if(l==r) {tree[u].L[0]=tree[u].R[0]=1;tree[u].L[1]=tree[u].R[1]=!(a[id[l]]>>k&1);return;}int mid=l+r>>1;build(u<<1,l,mid,k);build(u<<1|1,mid+1,r,k);pushup(u);}void modify(int u,int pos,bool x){if(tree[u].l==tree[u].r){tree[u].L[0]=tree[u].R[0]=1;tree[u].L[1]=tree[u].R[1]=(!x);return;}int mid=tree[u].l+tree[u].r>>1;if(pos<=mid) modify(u<<1,pos,x);elsemodify(u<<1|1,pos,x);pushup(u);}bool queryL(int u,int l,int r,bool c){if(l<=tree[u].l&&tree[u].r<=r) return tree[u].L[c];int mid=tree[u].l+tree[u].r>>1;if(r<=mid)return queryL(u<<1,l,r,c);else if(l>mid) return queryL(u<<1|1,l,r,c);else return queryL(u<<1|1,l,r,queryL(u<<1,l,r,c));}bool queryR(int u,int l,int r,bool c){if(l<=tree[u].l&&tree[u].r<=r) return tree[u].R[c];int mid=tree[u].l+tree[u].r>>1;if(r<=mid)return queryR(u<<1,l,r,c);else if(l>mid) return queryR(u<<1|1,l,r,c);else return queryR(u<<1,l,r,queryR(u<<1|1,l,r,c));}
}T[33];
//==============================================================
void dfs1(int u)
{dep[u]=dep[fa[u]]+1;sz[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(v==fa[u]) continue;fa[v]=u;dfs1(v);sz[u]+=sz[v];if(sz[son[u]]<sz[v]) son[u]=v;}
}void dfs2(int u,int t)
{dfn[u]=++timestamp;id[timestamp]=u;top[u]=t;if(son[u]) dfs2(son[u],t);for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(v==fa[u]||v==son[u]) continue;dfs2(v,v);}
}
//==============================================================
void update(int u,u32 x)
{for(int k=0;k<bit;k++)T[k].modify(1,dfn[u],x>>k&1);
}
u32 ask(int u,int v)
{u32 ans=0;vector<pii> ql,qr;while(top[u]!=top[v]){if(dep[top[u]]>=dep[top[v]])// debug 1h{qr.push_back({dfn[top[u]],dfn[u]});u=fa[top[u]];}else{ql.push_back({dfn[top[v]],dfn[v]});v=fa[top[v]];}}if(dep[u]>=dep[v]) qr.push_back({dfn[v],dfn[u]});elseql.push_back({dfn[u],dfn[v]});reverse(ql.begin(),ql.end());    for(pii t:qr){int l=t.first,r=t.second;for(int k=0;k<bit;k++)ans=ans-(ans&(1<<k))+(T[k].queryR(1,l,r,ans>>k&1)<<k);}for(pii t:ql){int l=t.first,r=t.second;for(int k=0;k<bit;k++)ans=ans-(ans&(1<<k))+(T[k].queryL(1,l,r,ans>>k&1)<<k);}return ans;
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);memset(h,-1,sizeof h);cin>>n>>m>>bit;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<n;i++){int u,v;cin>>u>>v;add(u,v),add(v,u);}dfs1(1);dfs2(1,1);for(int k=0;k<bit;k++)T[k].build(1,1,n,k);while(m--){char op[10];u32 a,b;cin>>op>>a>>b;if(*op=='R')update(a,b);elsecout<<ask(a,b)<<'\n';}return 0;
}

终于补完了区间NAND的板子

要加油哦~

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

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

相关文章

[译]RabbitMQ教程C#版 - 远程过程调用(RPC)

先决条件本教程假定 RabbitMQ 已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表 联系我们。在第 教程…

P7514-[省选联考2021A/B卷]卡牌游戏【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P7514 题目大意 给出nnn个卡牌有ai/bia_i/b_iai​/bi​&#xff0c;开始都是aia_iai​朝上&#xff0c;将不超过mmm张卡牌变为bib_ibi​面朝上&#xff0c;使得朝上的数字中最大值减去最小值最小。 3≤n≤106,1≤m<n,1≤a…

牛客题霸 [ 旋转数组] C++题解/答案

牛客题霸 [ 旋转数组] C题解/答案 题目描述 一个数组A中存有N&#xff08;N&gt0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A0 A1 ………

ML.NET速览

什么是ML.NET&#xff1f;ML.NET是由微软创建&#xff0c;为.NET开发者准备的开源机器学习框架。它是跨平台的&#xff0c;可以在macOS&#xff0c;Linux及Windows上运行。机器学习管道ML.NET通过管道(pipeline)方式组合机器学习过程。整个管道分为以下四个部分&#xff1a;Loa…

P6240 好吃的题目(分治+背包)

P6240 好吃的题目 类似于线段树分治&#xff0c;在每个节点预处理[l,mid],[mid1,r][l,mid],[mid1,r][l,mid],[mid1,r]的背包&#xff0c;然后询问即可 一般代码就类似下面的写法&#xff0c;但是此题有点卡空间于是稍微优化了一下空间。 时间复杂度O{nlog⁡nmax⁡(hi,ti)}O\{…

CF990G-GCD Counting【dfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF990G 题目大意 给出一棵有点权的树&#xff0c;对于每个kkk求有多条路径的点权gcdgcdgcd为kkk 1≤n≤2105,1≤ai≤21051\leq n\leq 2\times 10^5,1\leq a_i\leq 2\times 10^51≤n≤2105,1≤ai​≤2105 解题思路 开始以为要…

牛客题霸 [ 旋转数组的最小数字] C++题解/答案

牛客题霸 [ 旋转数组的最小数字] C题解/答案 题目描述 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。 NOTE&#xff1a;给出的所有元素都大于0&#xff0c;若数组…

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

写在前面千呼万唤始出来&#xff0c;首先&#xff0c;请允许我长吸一口气&#xff01;真没想到一份来自28岁老程序员的自白 这篇文章会这么火&#xff0c;更没想到的是张善友队长的公众号居然也转载了这篇文章&#xff0c;这就导致两天的时间就有两百多位读者朋友加入了.NET Co…

2018CCF-CSP 5.二次求和(点分治)

5.二次求和 暴力 首先观察询问&#xff0c;树上链u→vu\to vu→v点权加&#xff0c;显然可以用树上差分LOJ dfs序4 O(1)O(1)O(1)完成此操作&#xff0c;然后考虑对这些权值对答案的影响&#xff1f; 设经过某点uuu符合条件的路径条数为pathu\text{path}_upathu​ 当uuu点权ccc…

P4323-[JSOI2016]独特的树叶【换根dp,树哈希】

正题 题目链接:https://www.luogu.com.cn/problem/P4323 题目大意 给出nnn个点的树和加上一个点之后的树&#xff08;编号打乱&#xff09;。 求多出来的是哪个点&#xff08;如果有多少个就输出编号最小的&#xff09;。 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 定义…

牛客题霸 [ 数字在升序数组中出现的次数] C++题解/答案

牛客题霸 [ 数字在升序数组中出现的次数] C题解/答案 题目描述 统计一个数字在升序数组中出现的次数。 题解&#xff1a; 直接for循环&#xff0c;if判断一下&#xff0c;如果是目标的话ant 代码&#xff1a; class Solution { public:int GetNumberOfK(vector<int>…

.Net Core微服务系列--理论篇

微服务的由来微服务最早由Martin Fowler与James Lewis于2014年共同提出来的&#xff0c;但是微服务也不是一个全新的概念&#xff0c;它是由一系列在实践中获得成功并流行起来的概念中总结出来的一种模式&#xff0c;一种概念。而这一系列的概念大体上有这些:领域驱动设计(DDD)…

codeforces1496 D. Let‘s Go Hiking(乱搞+讨论)

这题我tm服了&#xff0c;考试中途肯定添加了一组数据&#xff0c;提交完A了之后&#xff0c;还有20min结束&#xff0c;感觉写不了下一个题了&#xff0c;就下班了&#xff0c;谁知道它有填了一组测试数据把我的乱搞给卡过去了&#xff0c;我又被fst了&#xff1f;&#xff1f…

CF1511G-Chips on a Board【倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF1511G 题目大意 给出n∗mn*mn∗m的棋盘上每一行有一个棋子&#xff0c;双方轮流操作可以把一个棋子向左移动若干步&#xff08;不能不动&#xff09;&#xff0c;无法操作者输。 qqq次询问只留下期盼的l∼rl\sim rl∼r列时…

牛客题霸 [ 调整数组顺序使奇数位于偶数前面] C++题解/答案

牛客题霸 [ 调整数组顺序使奇数位于偶数前面] C题解/答案 题目描述 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位于数组的前半部分&#xff0c;所有的偶数位于数组的后半部分&#xff0c;并保证奇数和奇数&#xff0c;偶数…

Asp.net Core Jenkins Docker 实现一键化部署

写在前面在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署。大概的流程是Jenkins从git上获取代码最开始Jenkins是放在Ubuntu的Docker中&#xff0c;但是由于Powershell执行的原因&#xff0c;就把Jenkins搬到了windows上。因为我们网站的部署需要停掉IIS站…

P5782-[POI2001]和平委员会【2-SAT】

正题 题目链接:https://www.luogu.com.cn/problem/P5782 题目大意 nnn对人&#xff0c;每对之间恰好有一个人出席。mmm对仇恨关系表示两个人不能同时出席。 求是否有解并输出。 1≤n≤8000,1≤m≤200001\leq n\leq 8000,1\leq m\leq 200001≤n≤8000,1≤m≤20000 解题思路 裸…

codeforces1497 E. Square-free division(数学+dp)

开学了&#xff0c;感觉没时间打cf了&#xff0c;上课听不懂&#xff0c;而且一直在忙转班的事情~~ 下周就要回学校了开心 昨天卡C题太久了&#xff0c;一直在想lcm的性质&#xff0c;还好最后回头了&#xff0c;当成构造题做了&#xff0c;瞎搞了搞就出来了&#xff0c;然后看…

牛客题霸 [合并二叉树] C++题解/答案

牛客题霸 [合并二叉树] C题解/答案 题目描述 已知两颗二叉树&#xff0c;将它们合并成一颗二叉树。合并规则是&#xff1a;都存在的结点&#xff0c;就将结点值加起来&#xff0c;否则空的位置就由另一个树的结点来代替。例如&#xff1a; 两颗二叉树是: Tree 1 1 / \ 3 2 / …

“校长”潘淳:侠之大者,一蓑烟雨任平生

我是与丁磊、蔡文胜同时代的人&#xff0c;他们都是70后大我两岁。我的经历与爱好与丁磊有丁点接近&#xff0c;但是没他下海走一走的胆识。又或者与蔡文胜一样&#xff0c;也算是国内最早的域名代理商&#xff0c;却又没有投资的勇气。—— 潘淳《IT英雄传》这一期的主角儿是江…