[P3613]睡觉困难综合征
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]睡觉困难综合征的更多相关文章
- 【刷题】洛谷 P3613 睡觉困难综合征
题目背景 刚立完Flag我就挂了WC和THUWC... 时间限制0.5s,空间限制128MB 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目 ...
- 洛谷P3613 睡觉困难综合征(LCT)
题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...
- 洛谷P3613 睡觉困难综合征(LCT,贪心)
洛谷题目传送门 膜拜神犇出题人管理员!!膜拜yler和ZSY!! 没错yler连续教我这个蒟蒻写起床困难综合症和睡觉困难综合症%%%Orz,所以按位贪心的思路可以继承下来 这里最好还是写树剖吧,不过我 ...
- P3613 睡觉困难综合征(LCT + 位运算)
题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...
- [洛谷]P3613 睡觉困难综合征
题目大意:给出一棵n个点的树,每个点有一个运算符(与.或.异或)和一个数,支持两种操作,第一种修改一个点的运算符和数,第二种给出x,y,z,询问若有一个0~z之间的数从点x走到点y(简单路径),并且对 ...
- 洛谷P3613 睡觉困难综合征
传送门 题解 人生第一道由乃…… 做这题之前应该先去把这一题给切掉->这里 我的题解->这里 然后先膜一波zsy大佬和flashhu大佬 大体思路就是先吧全0和全1的都跑答案,然后按位贪心 ...
- P3613 睡觉困难综合征 LCT+贪心+位运算
\(\color{#0066ff}{ 题目描述 }\) 由乃这个问题越想越迷糊,已经达到了废寝忘食的地步.结果她发现--晚上睡不着了!只能把自己的一个神经元(我们可以抽象成一个树形结构)拿出来,交给D ...
- P3613 睡觉困难综合征(码力)
Luogu3613 实现细节较多,详见代码 #include<cstdio> #include<iostream> #include<cstring> #inclu ...
- Luogu 睡觉困难综合征 ([NOI2014]起床困难综合症)
一.[NOI2014]起床困难综合症 题目描述 网址:https://daniu.luogu.org/problemnew/show/2114 大意: 有一条链,链上每一个节点包含一个位运算f 与 一 ...
随机推荐
- 滴水穿石-07Java开发中常见的错误
1:使用工具Eclipse 1.1 "语法错误" 仅当源级别为 1.5 时已参数化的类型才可用 设置eclipse,窗口—>java—>编译器—>JDK一致性调到 ...
- Sublime Text 3 快捷键总结(拿走)
以下是个人总结不完全的快捷键总汇,祝愿各位顺利解放自己的鼠标. 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同 ...
- map reduce程序示例
map reduce程序示例 package test2; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop. ...
- springboot快速使用
1.编写SpringConfig 用于实例化Spring容器 @Configuration //通过该注解来表明该类是一个Spring的配置,相当于一个xml文件 @Bean // 通过该注解来表明是 ...
- Task任务的屏障机制
Barrier 是 .Net 提供的一直并发的机制,它允许多个任务同步他们不同阶段的并发工作. 这里的关键点是[多个任务]和[不同阶段]. 假设有4个相同的任务(Task),每个任务都有4个阶段(Ph ...
- HDU 1384 Intervals【差分约束-SPFA】
类型:给出一些形如a−b<=k的不等式(或a−b>=k或a−b<k或a−b>k等),问是否有解[是否有负环]或求差的极值[最短/长路径].例子:b−a<=k1,c−b&l ...
- mysql binary
mysql在比较字符串的时候是忽略大些写的 比如有用户叫ABC和abc select * from `sys_user` where username = 'abc' 会出来两条记录 select * ...
- Python_shelve模块
shelve:对象持久化的保存的模块,将对象保存到文件里 (默认的数据存储文件为二进制),可持久化任何pickle可支持的Python数据格式 shelve 中唯一的方法: shelve.open( ...
- ELK收集Nginx自定义日志格式输出
1.ELK收集日志的有两种常用的方式: 1.1:不修改源日志格式,简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式) ...
- img没有src属性时自动出现边框
当img没有接收到src属性的时候会自动出现边框,border:0/none都不管用的情况下 解决方法 一行css 可以解决 img[src=""],img:not([src]){ ...