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

  • 询问[l,r][l,r][l,r]区间与非的值即alNANDal+1NAND…NANDara_l \text{NAND} a_{l+1} \text{NAND}\dots \text{NAND} a_ral​NANDal+1​NAND…NANDar​
  • 单线修改p,xp,xp,x即ap=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的板子

要加油哦~

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

  1. BZOJ 2243 染色(树链剖分好题)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 7971  Solved: 2990 [Submit][Stat ...

  2. 【BZOJ2908】又是nand 树链剖分+线段树

    [BZOJ2908]又是nand escription 首先知道A nand B=not(A and B) (运算操作限制了数位位数为K)比如2 nand 3,K=3,则2 nand 3=not (2 ...

  3. BZOJ 4034 [HAOI2015]T2 树链剖分

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  4. bzoj 4127: Abs(树链剖分+线段树)

    4127: Abs Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 667  Solved: 225 [Submit][Status][Discuss ...

  5. BZOJ 4034: [HAOI2015]T2 树链剖分

    4034: [HAOI2015]T2 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操 ...

  6. CF487E Tourists(圆方树+树链剖分)

    洛谷题目传送门 解题思路 不会圆方树的可以看我的博客圆方树学习记录及例题 首先Tarjan寻找点双连通分量,然后建立圆方树,每个方点存这个点双内的最小点权 将圆方树树链剖分之后,对于修改操作,将这个点 ...

  7. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  8. bzoj 4034: [HAOI2015]树上操作(树链剖分+线段树区间更新)

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 4981  Solved: 1603 [Submit][St ...

  9. BZOJ 2402 陶陶的难题II (树链剖分、线段树、凸包、分数规划)

    毒瘤,毒瘤,毒瘤-- \(30000\)这个数据范围,看上去就是要搞事的啊... 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2402 ...

最新文章

  1. 腾讯某员工哀叹:门口卖早点的送孩子去私立了,一年学费顶我一年工资!
  2. php验证 js验证邮箱格式,js和php邮箱地址验证的实现方法
  3. 如何用python画出中国地图-用Python画一个中国地图
  4. C#类中操作UI层控件状态[原]
  5. 让 CPU 告诉你硬盘和网络到底有多慢
  6. 浏览器厂商开始默认支持WebAssembly格式
  7. iosetup mysql_InnoDB: Error: io_setup() failed with EAGAIN after 5 attempt
  8. html选择文件夹插件,js/jq仿window文件夹框选操作插件
  9. redis lua 抽奖 PHP,通过redis+lua实现加减库存
  10. 程序员101:如何自学编程
  11. python mysql 基于 sqlalvhrmy_Python基于DB-API操作MySQL数据库过程解析
  12. (98)利用函数function实现半字节加法功能,面试必问(二十二)(第20天)
  13. 15crmo焊接后多长时间探伤_焊工必看:掌握钢结构焊接最重要的10个知识,不愁拿不到高工资!...
  14. rsa算法的java实现,RSA算法的实现——java版
  15. 新版谷歌开启flash的方法
  16. 百度云c++语言模拟器,C++语言基础教程
  17. 十大游戏开发引擎优缺点对比
  18. (一)Activiti 数据库25张表——一般数据2 (ACT_GE_PROPERTY)
  19. RxJava3.x入门(七)——背压策略
  20. MonsoonRF推出新型RFID读取器,安装难度和换灯泡差不多

热门文章

  1. php文字左右滚动代码,JavaScript
  2. python list remove 删除引用_Python——list列表操作一坑(remove)
  3. 长春工业大学计算机科学与技术录取分数,2021年长春工业大学各省各专业最低投档录取分数线统计(文科 理科)...
  4. session.setAttribute和request.setAttribute的区别
  5. 7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!
  6. python编程中的小问题汇总
  7. 洛谷 P1506 拯救oibh总部-dfs染色法
  8. C++拷贝构造函数调用时机分析
  9. C++set容器-内置类型指定排序
  10. 数据结构-排序-分配类排序-知识点总结归纳3