Description:

给定一个n个点的树,每个点有一个操作符号 "&" "|" "^" ,以及一个权值

要求支持以下操作:

1.修改x点的操作符号和权值

2.给定w,你需要找一个数v,经过从x到y的路径上的所有运算后使答案最大,输出这个答案

Hint:

\(n \le 10^5\)

Solution:

这题是 https://www.cnblogs.com/list1/p/10499412.html 的树上多组询问带修版

原题需要维护每个位最初是0/1经运算后得到的是0还是1

所以我们这题也这么做

考虑如何在线段树上合并信息

\(f_{l0} ,f_{r0} ​\) 表示以0进入该节点区间,经运算后得到的值

分类讨论:

当 \(f_{l0}==1 \&\& f_{r1}==0​\) 或 \(f_{l1}==0 \&\& f_{r0}==0​\) 时

\(f_{p0}=0​\)

同理我们可以推出其他四种转移,详见代码

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef unsigned long long ll;
const int mxn=2e5+5;
const ll lim=-1;
int n,q,k,t1,t2,cnt,tot;
int o[mxn],f[mxn],sz[mxn],hd[mxn],rk[mxn],top[mxn],dep[mxn],dfn[mxn],son[mxn];
ll a[mxn]; inline ll read() {
char c=getchar(); ll x=0,f=1;
while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}
return x*f;
}
inline int chkmax(int &x,int y) {if(x<y) x=y;}
inline int chkmin(int &x,int y) {if(x>y) x=y;} struct data {
ll f0,f1,inv0,inv1;
data() {f0=f1=inv0=inv1=0;}
}tr[mxn<<2],r1[mxn],r2[mxn]; struct ed {
int to,nxt;
}t[mxn<<1]; inline void add(int u,int v) {
t[++cnt]=(ed) {v,hd[u]}; hd[u]=cnt;
} void dfs1(int u,int fa)
{
dep[u]=dep[fa]+1; sz[u]=1; f[u]=fa;
for(int i=hd[u];i;i=t[i].nxt) {
int v=t[i].to;
if(v==fa) continue ;
dfs1(v,u); sz[u]+=sz[v];
if(sz[son[u]]<sz[v]) son[u]=v;
}
} void dfs2(int u,int tp)
{
dfn[u]=++tot; rk[tot]=u; top[u]=tp;
if(son[u]) dfs2(son[u],tp);
for(int i=hd[u];i;i=t[i].nxt) {
int v=t[i].to;
if(v==f[u]||v==son[u]) continue ;
dfs2(v,v);
}
} ll cal(ll val,int x)
{
if(o[x]==1) return val&a[x];
if(o[x]==2) return val|a[x];
if(o[x]==3) return val^a[x];
} data push_up(data lc,data rc)
{
data res;
res.f0=((lc.f0&rc.f1)|((~lc.f0)&rc.f0));
res.f1=((lc.f1&rc.f1)|((~lc.f1)&rc.f0));
res.inv0=((rc.inv0&lc.inv1)|((~rc.inv0)&lc.inv0));
res.inv1=((rc.inv1&lc.inv1)|((~rc.inv1)&lc.inv0));
return res;
} void build(int l,int r,int p)
{
if(l==r) {
tr[p].f0=tr[p].inv0=cal(0,rk[l]);
tr[p].f1=tr[p].inv1=cal(lim,rk[l]);
return ;
}
int mid=(l+r)>>1;
build(l,mid,ls);
build(mid+1,r,rs);
tr[p]=push_up(tr[ls],tr[rs]);
} void update(int l,int r,int pos,int p)
{
if(l==r) {
tr[p].f0=tr[p].inv0=cal(0,rk[l]);
tr[p].f1=tr[p].inv1=cal(lim,rk[l]);
return ;
}
int mid=(l+r)>>1;
if(pos<=mid) update(l,mid,pos,ls);
else update(mid+1,r,pos,rs);
tr[p]=push_up(tr[ls],tr[rs]);
} data query(int l,int r,int ql,int qr,int p)
{
if(ql<=l&&r<=qr) return tr[p]; int mid=(l+r)>>1;
if(qr<=mid) return query(l,mid,ql,qr,ls);
else if(ql>mid) return query(mid+1,r,ql,qr,rs);
else return push_up(query(l,mid,ql,qr,ls),query(mid+1,r,ql,qr,rs));
} data solve(int x,int y)
{
t1=t2=0;
while(top[x]!=top[y]) {
if(dep[top[x]]>=dep[top[y]]) {
r1[++t1]=query(1,n,dfn[top[x]],dfn[x],1);
x=f[top[x]];
}
else {
r2[++t2]=query(1,n,dfn[top[y]],dfn[y],1);
y=f[top[y]];
}
}
if(dep[x]>dep[y]) r1[++t1]=query(1,n,dfn[y],dfn[x],1);
else r2[++t2]=query(1,n,dfn[x],dfn[y],1);
data res;
for(int i=1;i<=t1;++i)
swap(r1[i].f0,r1[i].inv0),swap(r1[i].f1,r1[i].inv1);
if(t1) {
res=r1[1];
for(int i=2;i<=t1;++i) res=push_up(res,r1[i]);
if(t2) res=push_up(res,r2[t2]);
}
else res=r2[t2];
for(int i=t2-1;i>=1;--i) res=push_up(res,r2[i]);
return res;
} int main()
{
n=read(); q=read(); k=read(); int opt,u,v; ll w,ans;
for(int i=1;i<=n;++i) o[i]=read(),a[i]=read();
for(int i=1;i<n;++i) {
u=read(); v=read();
add(u,v); add(v,u);
}
dfs1(1,0); dfs2(1,1); build(1,n,1);
for(int i=1;i<=q;++i) {
opt=read(); u=read(); v=read(); w=read();
if(opt==2) {
o[u]=v; a[u]=w;
update(1,n,dfn[u],1);
}
else {
data res=solve(u,v); ans=0; ll tp0,tp1;
for(int i=63;i>=0;--i)
if(res.f0>>i&1ull) ans|=1ull<<i;
else if((res.f1>>i&1)&&(1ull<<i)<=w) ans|=1ull<<i,w-=1ull<<i;
printf("%llu\n",ans);
}
}
return 0;
}

[P3613]睡觉困难综合征的更多相关文章

  1. 【刷题】洛谷 P3613 睡觉困难综合征

    题目背景 刚立完Flag我就挂了WC和THUWC... 时间限制0.5s,空间限制128MB 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目 ...

  2. 洛谷P3613 睡觉困难综合征(LCT)

    题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...

  3. 洛谷P3613 睡觉困难综合征(LCT,贪心)

    洛谷题目传送门 膜拜神犇出题人管理员!!膜拜yler和ZSY!! 没错yler连续教我这个蒟蒻写起床困难综合症和睡觉困难综合症%%%Orz,所以按位贪心的思路可以继承下来 这里最好还是写树剖吧,不过我 ...

  4. P3613 睡觉困难综合征(LCT + 位运算)

    题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...

  5. [洛谷]P3613 睡觉困难综合征

    题目大意:给出一棵n个点的树,每个点有一个运算符(与.或.异或)和一个数,支持两种操作,第一种修改一个点的运算符和数,第二种给出x,y,z,询问若有一个0~z之间的数从点x走到点y(简单路径),并且对 ...

  6. 洛谷P3613 睡觉困难综合征

    传送门 题解 人生第一道由乃…… 做这题之前应该先去把这一题给切掉->这里 我的题解->这里 然后先膜一波zsy大佬和flashhu大佬 大体思路就是先吧全0和全1的都跑答案,然后按位贪心 ...

  7. P3613 睡觉困难综合征 LCT+贪心+位运算

    \(\color{#0066ff}{ 题目描述 }\) 由乃这个问题越想越迷糊,已经达到了废寝忘食的地步.结果她发现--晚上睡不着了!只能把自己的一个神经元(我们可以抽象成一个树形结构)拿出来,交给D ...

  8. P3613 睡觉困难综合征(码力)

    Luogu3613 实现细节较多,详见代码 #include<cstdio> #include<iostream> #include<cstring> #inclu ...

  9. Luogu 睡觉困难综合征 ([NOI2014]起床困难综合症)

    一.[NOI2014]起床困难综合症 题目描述 网址:https://daniu.luogu.org/problemnew/show/2114 大意: 有一条链,链上每一个节点包含一个位运算f 与 一 ...

随机推荐

  1. spring cloud Hystrix监控面板Hystrix Dashboard和Turbine

    我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixCommand和HystrixObservableCommand实例在执行过程 ...

  2. 微信小程序开发 如何退出当前页面

    默认是在首页 wx.navigateBack({     delta: -1 });     详情参考. https://mp.weixin.qq.com/debug/wxadoc/dev/api/u ...

  3. 通过ModelForm实现主机添加和编辑

    通过ModelForm实现主机添加和编辑 ModelForm这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来:在使用Model和Form时,都需要对字段进行 ...

  4. WCF三种通信方式

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

  5. .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  6. explicit specialization 显式指定

    //explicit specialization 显式指定 #include "stdafx.h" #include <iostream> #include < ...

  7. .net core vs2015 vs2017打开后errpr

    需要将每个项目中增加global.json  并设置sdk的版本,注意,每个类库中均需增加. { "sdk": { "version": "1.0.0 ...

  8. POJ 2987 Firing【最大权闭合图-最小割】

    题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点.选择每个点有各自的利益或损失.求最大化的利益,以及此时选择人数的最小值. 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益.每 ...

  9. 铺放骨牌 uva11270

    题解: 插头dp裸题 没什么好说的啊就是n个二进制位表示状态 相比原先就是用2n个二进制位表示状态 蓝书上后面几题插头dp都挺烦的啊... 代码:

  10. HTML LIST 输入框自动查询追加框,自动过滤 HTML5

    <!DOCTYPE HTML> <html> <body> <form action="/example/html5/demo_form.asp&q ...