Luogu3613

实现细节较多,详见代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef unsigned long long LL;//64为,要开ull
const LL INF=0-1;
inline LL read(){
register LL x=0;register char c=getchar();
while(c<48||c>57){c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return x;
} const int MAXN=200005;
const int MAXM=400005; struct Edge{
int v,next;
}e[MAXM];
int first[MAXN],Ecnt=1;
inline void Add_edge(int u,int v){
e[++Ecnt]=(Edge){v,first[u]};
first[u]=Ecnt;
} int fa[MAXN],son[MAXN],size[MAXN],dep[MAXN],seg[MAXN],rev[MAXN],top[MAXN];
int n,m,K;
LL ans; inline void dfs1(int u,int pre){
dep[u]=dep[pre]+1,size[u]=1,fa[u]=pre;
for(int i=first[u];i;i=e[i].next){
int v=e[i].v;
if(v==pre) continue;
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]]) son[u]=v;
}
} inline void dfs2(int u,int pre){
seg[u]=++seg[0];
rev[seg[0]]=u;
if(son[u]){
top[son[u]]=top[u];
dfs2(son[u],u);
}
for(int i=first[u];i;i=e[i].next){
int v=e[i].v;
if(v==pre||v==son[u]) continue;//记得判重儿子不能再走
top[v]=v;
dfs2(v,u);
}
} namespace SGT{
struct data{
LL f0,f1,inv0,inv1;
data(){f0=f1=inv0=inv1=0;}
}a[MAXN<<2],ans1[MAXN],ans2[MAXN]; LL val[MAXN];int op[MAXN];
int cnt1,cnt2;
#define ls (rt<<1)
#define rs (rt<<1|1) inline LL calc(LL num,int x){
if(op[x]==1) return num&val[x];
if(op[x]==2) return num|val[x];
if(op[x]==3) return num^val[x];
} inline data update(data l,data r){
data res;
res.f0=((l.f0&r.f1)|((~l.f0)&r.f0));//想清楚
res.f1=((l.f1&r.f1)|((~l.f1)&r.f0));
res.inv0=((r.inv0&l.inv1)|((~r.inv0)&l.inv0));
res.inv1=((r.inv1&l.inv1)|((~r.inv1)&l.inv0));
return res;
} inline void pushup(int rt){
a[rt]=update(a[ls],a[rs]);
} inline void build(int rt,int l,int r){
if(l==r){
a[rt].f0=a[rt].inv0=calc(0,rev[l]);
a[rt].f1=a[rt].inv1=calc(INF,rev[l]);
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
} inline void modify(int rt,int l,int r,int pos){
if(l==r){
a[rt].f0=a[rt].inv0=calc(0,rev[l]);
a[rt].f1=a[rt].inv1=calc(INF,rev[l]);
return;
}
int mid=(l+r)>>1;
if(pos<=mid) modify(ls,l,mid,pos);
else modify(rs,mid+1,r,pos);
pushup(rt);
} inline data query(int rt,int l,int r,int x,int y){
if(l>=x&&r<=y) return a[rt];
int mid=(l+r)>>1;
if(y<=mid) return query(ls,l,mid,x,y);
if(x>mid) return query(rs,mid+1,r,x,y);
return update(query(ls,l,mid,x,y),query(rs,mid+1,r,x,y));
} inline data solve(int x,int y){
cnt1=cnt2=0;
while(top[x]!=top[y]){
if(dep[top[x]]>=dep[top[y]]){
ans1[++cnt1]=query(1,1,n,seg[top[x]],seg[x]);
x=fa[top[x]];
}
else{
ans2[++cnt2]=query(1,1,n,seg[top[y]],seg[y]);
y=fa[top[y]];
}
}
if(dep[x]>dep[y]) ans1[++cnt1]=query(1,1,n,seg[y],seg[x]);
else ans2[++cnt2]=query(1,1,n,seg[x],seg[y]);
data res;
for(int i=1;i<=cnt1;i++) swap(ans1[i].f0,ans1[i].inv0),swap(ans1[i].f1,ans1[i].inv1);//选一个方向反过来
if(cnt1){
res=ans1[1];
for(int i=2;i<=cnt1;i++) res=update(res,ans1[i]);
if(cnt2) res=update(res,ans2[cnt2]);
}
else res=ans2[cnt2];
for(int i=cnt2-1;i>=1;i--) res=update(res,ans2[i]);
return res;
}
#undef ls
#undef rs
}using namespace SGT; signed main(){
//freopen("asd.in","r",stdin);
n=read(),m=read(),K=read();
for(int i=1;i<=n;i++) op[i]=read(),val[i]=read();
for(int i=1;i<=n-1;i++){
int x=read(),y=read();
Add_edge(x,y);
Add_edge(y,x);
}
dfs1(1,0);
top[1]=1;dfs2(1,0);
build(1,1,n);
while(m--){
int opt=read(),x=read(),y=read();LL z=read();
if(opt==1){
data res=solve(x,y);ans=0;//把64的状态存到一个unsigned long long里面,优化掉k
for(int i=63;i>=0;i--){
LL tmp0=(res.f0>>i)&(1ull);
LL tmp1=(res.f1>>i)&(1ull);
if(tmp0>=tmp1||(1ull<<i)>z) ans|=(tmp0?(1ull<<i):0);//贪心,也要想清楚
else ans|=tmp1?(1ull<<i):0,z-=(1ull<<i);//所选数不能超过z
}
printf("%llu\n",ans);
}
if(opt==2){
op[x]=y,val[x]=z;
modify(1,1,n,seg[x]);
}
}
}

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]睡觉困难综合征

    Description: 给定一个n个点的树,每个点有一个操作符号 "&" "|" "^" ,以及一个权值 要求支持以下操作: 1. ...

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

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

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

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

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

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

随机推荐

  1. pl/sql使用部分整理

    在工作中使用pl/sql工具,总结一下常用操作,以便以后复习,也希望帮助朋友们熟悉pl/sql操作! 1.pl/sql记住登录密码PL/SQL Developer->tools->Pref ...

  2. Ok6410裸机驱动学习(三)C语言内嵌汇编

    1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...

  3. DAY19-Pillow制作验证码

    PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修 ...

  4. DAY9-python并发之多线程

    一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python ...

  5. 一些API的用法

    //1.init初始化 NSString * str1 = [[NSString alloc] init]; NSLog(@"str1 = %@",str1); //2.initW ...

  6. day17 13.滚动结果集介绍

    滚动 一般结果集只能是向下的,不是滚动的,你要是想让它滚动你得设置才行. 类名或者接口里面有静态的可以.接口里面的属性全部都是public static final,类名/接口名.是属性,这些都是常量 ...

  7. Tensorflow手写数字识别训练(梯度下降法)

    # coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #p ...

  8. c++ 切勿重新定义继承来的带缺省参数的函数

    切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承 ...

  9. 关于css js文件缓存问题

    什么情况下,要禁止静态文件缓存:1.经常可能要改动的 js, css.比如一个js文件引用如下<script src="test.js"></script> ...

  10. 关于文本PDG的字体

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2008.08.03 有不少人在问为什么有些文本PDG在SSREADER里看到的是宋体,在Acobat里看到的是黑体,其实原因 ...