Description

Link.

起床困难综合症 上树。

Solution

线段树维护,树剖上树。

具体题解有空再写,我要去睡觉了。

#include<bits/stdc++.h>
typedef unsigned long long ULL;
struct node {
ULL one,zero;
node(ULL A=0,ULL B=0) {
one=A;
zero=B;
}
}nodes[400010],exnodes[400010],res,exres;
ULL poi[100010],opz;
int k,dep[100010],son[100010],hb[100010],fa[100010],dfn[100010],sjc,op[100010],n,m,rev[100010],siz[100010];
int head[100010],nxt[200010],to[200010],cntot,opt,opx,opy;
bool flag,exflag;
void addEdge(int one,int ano) {
to[++cntot]=ano;
nxt[cntot]=head[one];
head[one]=cntot;
}
node merge(node one,node ano) {
node res(~0ull);
ULL tmp=one.one,extmp=~tmp;
res.one=(tmp&ano.one)|(extmp&ano.zero);
tmp=one.zero;
extmp=~tmp;
res.zero=(tmp&ano.one)|(extmp&ano.zero);
return res;
}
void adj(ULL &x,ULL y,int id) {
if(id==1) {
x&=y;
} else if(id==2) {
x|=y;
} else {
x^=y;
}
}
void build(int l,int r,int x) {
if(l^r) {
int mid=(l+r)>>1;
build(l,mid,x<<1);
build(mid+1,r,x<<1|1);
nodes[x]=merge(nodes[x<<1],nodes[x<<1|1]);
exnodes[x]=merge(exnodes[x<<1|1],exnodes[x<<1]);
} else {
nodes[x]=exnodes[x]=node(~0ull);
adj(nodes[x].one,poi[rev[l]],op[rev[l]]);
adj(nodes[x].zero,poi[rev[l]],op[rev[l]]);
adj(exnodes[x].one,poi[rev[l]],op[rev[l]]);
adj(exnodes[x].zero,poi[rev[l]],op[rev[l]]);
}
}
void ins(int l,int r,int x,int pos,int aj,ULL val) {
if(l^r) {
int mid=(l+r)>>1;
if(mid>=pos) {
ins(l,mid,x<<1,pos,aj,val);
} else {
ins(mid+1,r,x<<1|1,pos,aj,val);
}
nodes[x]=merge(nodes[x<<1],nodes[x<<1|1]);
exnodes[x]=merge(exnodes[x<<1|1],exnodes[x<<1]);
} else {
op[rev[l]]=aj;
poi[rev[l]]=val;
nodes[x]=exnodes[x]=node(~0ull);
adj(nodes[x].one,poi[rev[l]],op[rev[l]]);
adj(nodes[x].zero,poi[rev[l]],op[rev[l]]);
adj(exnodes[x].one,poi[rev[l]],op[rev[l]]);
adj(exnodes[x].zero,poi[rev[l]],op[rev[l]]);
}
}
void find(int l,int r,int x,int fr,int ba) {
if(l>ba || r<fr) {
return;
} else {
if(l>=fr && r<=ba) {
if(!flag) {
res=nodes[x];
flag=true;
} else {
res=merge(nodes[x],res);
}
} else {
int mid=(l+r)>>1;
find(mid+1,r,x<<1|1,fr,ba);
find(l,mid,x<<1,fr,ba);
}
}
}
void exfind(int l,int r,int x,int fr,int ba) {
if(l>ba || r<fr) {
return;
} else {
if(l>=fr && r<=ba) {
if(!exflag) {
exres=exnodes[x];
exflag=true;
} else {
exres=merge(exres,exnodes[x]);
}
} else {
int mid=(l+r)>>1;
exfind(mid+1,r,x<<1|1,fr,ba);
exfind(l,mid,x<<1,fr,ba);
}
}
}
node LCA(int x,int y) {
flag=exflag=false;
res=exres=node(~0ull);
while(hb[x]^hb[y]) {
if(dep[hb[x]]>dep[hb[y]]) {
exfind(1,n,1,dfn[hb[x]],dfn[x]);
x=fa[hb[x]];
} else {
find(1,n,1,dfn[hb[y]],dfn[y]);
y=fa[hb[y]];
}
}
if(dep[x]<dep[y]) {
find(1,n,1,dfn[x],dfn[y]);
} else {
exfind(1,n,1,dfn[y],dfn[x]);
}
return merge(exres,res);
}
void dfs1(int x,int las) {
dep[x]=dep[las]+1;
fa[x]=las;
siz[x]=1;
for(int i=head[x];i;i=nxt[i]) {
int y=to[i];
if(y^las) {
dfs1(y,x);
siz[x]+=siz[y];
if(siz[son[x]]<siz[y]) {
son[x]=y;
}
}
}
}
void dfs2(int x,int t) {
hb[x]=t;
dfn[x]=++sjc;
rev[sjc]=x;
if(son[x]) {
dfs2(son[x],t);
for(int i=head[x];i;i=nxt[i]) {
int y=to[i];
if((y^fa[x]) && (y^son[x])) {
dfs2(y,y);
}
}
}
}
ULL solve(node now,ULL lim) {
ULL res=0,run=0;
for(int i=k-1;~i;--i) {
if(now.zero&(1ull<<i)) {
res+=(1ull<<i);
} else if((now.one&(1ull<<i)) && run+(1ull<<i)<=lim) {
run+=(1ull<<i);
res+=(1ull<<i);
}
}
return res;
}
char fgc() {
static char buf[1<<21],*p=buf,*q=buf;
return p==q && (q=buf+fread(p=buf,1,1<<21,stdin),p==q)?EOF:*p++;
}
template<typename T>
void read(T &hhh) {
T x=0;
int f=0;
char c=fgc();
while(c<'0' || c>'9') {
if(c=='-') {
f=1;
}
c=fgc();
}
while(c>='0' && c<='9') {
x=(x<<3)+(x<<1)+(c^'0');
c=fgc();
}
if(f) {
hhh=-x;
} else {
hhh=x;
}
}
int wrstk[100];
template<typename T>
void write(T x,char las='\n') {
int top=0,f=0;
if(x<0) {
x=-x;
f=1;
}
do {
wrstk[++top]=x%10;
x/=10;
} while(x);
if(f) {
putchar('-');
}
while(top) {
putchar(wrstk[top--]^'0');
}
putchar(las);
}
int main() {
read(n);
read(m);
read(k);
for(int i=1;i<=n;++i) {
read(op[i]);
read(poi[i]);
}
for(int i=1,x,y;i<n;++i) {
read(x);
read(y);
addEdge(x,y);
addEdge(y,x);
}
dfs1(1,0);
dfs2(1,1);
build(1,n,1);
while(m-->0) {
read(opt);
read(opx);
read(opy);
read(opz);
if(opt==1) {
if(k) {
write(solve(LCA(opx,opy),opz));
} else {
write(0);
}
} else {
ins(1,n,1,dfn[opx],opy,opz);
}
}
return 0;
}

Solution -「YunoOI 2017」由乃的 OJ的更多相关文章

  1. Solution -「CEOI 2017」「洛谷 P4654」Mousetrap

    \(\mathscr{Description}\)   Link.   在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...

  2. Solution -「NWRRC 2017」「洛谷 P7024」Fygon 2.0

    \(\mathcal{Description}\)   Link.   给定一个无并列语句的多重循环,每个变量取值的左端点只能是 \(1\) 或已定义的变量:右端点只能是 \(n\) 或已定义的变量. ...

  3. Solution -「SDOI 2017」「洛谷 P3784」遗忘的集合

    \(\mathcal{Description}\)   Link.   给定 \(\{f_1,f_2,\cdots,f_n\}\),素数 \(p\).求字典序最小的 \(\{a_1,a_2,\cdot ...

  4. LOJ 2288「THUWC 2017」大葱的神力

    LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...

  5. 「THUSCH 2017」大魔法师 解题报告

    「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...

  6. 「THUWC 2017」随机二分图

    「THUWC 2017」随机二分图 解题思路 : 首先有一个 \(40pts\) 的做法: 前 \(20pts\) 暴力枚举最终的匹配是怎样的,check一下计算方案数,后 \(20pts\) 令 \ ...

  7. 「NOIP 2017」列队

    题目大意:给定一个 $n times m$ 的方阵,初始时第 $i$ 行第 $j$ 列的人的编号为 $(i-1) times m + j$,$q$ 次给出 $x,y$,让第 $x$ 行 $y$ 列的人 ...

  8. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  9. Solution -「LOJ #6029」「雅礼集训 2017」市场

    \(\mathcal{Description}\)   Link.   维护序列 \(\lang a_n\rang\),支持 \(q\) 次如下操作: 区间加法: 区间下取整除法: 区间求最小值: 区 ...

  10. @loj - 2977@ 「THUSCH 2017」巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...

随机推荐

  1. 浅谈 ByteHouse Projection 优化实践

    预聚合是 OLAP 系统中常用的一种优化手段,在通过在加载数据时就进行部分聚合计算,生成聚合后的中间表或视图,从而在查询时直接使用这些预先计算好的聚合结果,提高查询性能,实现这种预聚合方法大多都使用物 ...

  2. Kafka的系统架构和API开发

    系统架构 主题topic和分区partition topic Kafka中存储数据的逻辑分类:你可以理解为数据库中"表"的概念:比如,将app端日志.微信小程序端日志.业务库订单表 ...

  3. 如何吃透一个Java项目?

    现在Austin的文档我觉得还是比较全的,但到了看代码的时候,可能有的同学就不知道应该怎么看,有想知道模块之间的调用链路,有想一点一点把细节给全看了.这时候就很可能在项目里犯迷糊了,绕不出不来了. J ...

  4. 【VS Code 与 Qt6】运用事件过滤器批量操作子级组件

    如果某个派生自 QObject 的类重写 eventFilter 方法,那它就成了事件过滤器(Event Filter).该方法的声明如下: virtual bool eventFilter(QObj ...

  5. x.ai还是OpenAI?埃隆·马斯克的AI帝国【1】

    大家可能知道,在上个月底埃隆·马斯克与1000多名来自各个行业的专家一起联名签署了"Future of Life Institute"发起的一个请愿书,呼吁全社会暂停至少6个月的高 ...

  6. R数据分析:解决科研中的“可重复危机”,理解Rmarkdown

    不知道刚接触科研的大伙儿有没有这么一个感觉,别人的研究很大可能你重复不出来,尤其是社科实证研究,到现在我都还觉得所谓的实证是个很玄乎的东西: 如果是刚开始做数据分析,很多时候你会发现自己的分析结果过几 ...

  7. 曾经辛苦造的轮子,现在能否用 ChatGPT 替代呢?

    上一篇文章 我在 vscode 插件里接入了 ChatGPT,解决了代码变量命名的难题 中,展示了如何在 vscode 插件中使用 ChatGPT 解决代码变量命名的问题.vscode 插件市场中有很 ...

  8. GPT3的性能评估:比较不同语言、文本和任务的差异

    目录 GPT-3 性能评估:比较不同语言.文本和任务的差异 近年来,自然语言处理 (NLP) 和人工智能领域取得了巨大的进展,其中 GPT-3 是目前最为先进的语言模型之一.GPT-3 拥有超过 17 ...

  9. 免杀系列之利用blockdlls和ACG保护恶意进程

    blockdlls Cobalt Strike 3.14版本以后添加了blockdlls功能,它将创建一个子进程并限定该子进程只能加载带有Microsoft签名的DLL. 这个功能可以阻止第三方安全软 ...

  10. C语言。格式化符号

    %s 输出字符串 %d 输出整形数字 %f 输出浮点数数字 %c 输出字符 %x 输出16进制 %04d 输出长度固定的整形数字(0001,0002,....)