Solution -「YunoOI 2017」由乃的 OJ
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的更多相关文章
- Solution -「CEOI 2017」「洛谷 P4654」Mousetrap
\(\mathscr{Description}\) Link. 在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...
- Solution -「NWRRC 2017」「洛谷 P7024」Fygon 2.0
\(\mathcal{Description}\) Link. 给定一个无并列语句的多重循环,每个变量取值的左端点只能是 \(1\) 或已定义的变量:右端点只能是 \(n\) 或已定义的变量. ...
- Solution -「SDOI 2017」「洛谷 P3784」遗忘的集合
\(\mathcal{Description}\) Link. 给定 \(\{f_1,f_2,\cdots,f_n\}\),素数 \(p\).求字典序最小的 \(\{a_1,a_2,\cdot ...
- LOJ 2288「THUWC 2017」大葱的神力
LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...
- 「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...
- 「THUWC 2017」随机二分图
「THUWC 2017」随机二分图 解题思路 : 首先有一个 \(40pts\) 的做法: 前 \(20pts\) 暴力枚举最终的匹配是怎样的,check一下计算方案数,后 \(20pts\) 令 \ ...
- 「NOIP 2017」列队
题目大意:给定一个 $n times m$ 的方阵,初始时第 $i$ 行第 $j$ 列的人的编号为 $(i-1) times m + j$,$q$ 次给出 $x,y$,让第 $x$ 行 $y$ 列的人 ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「LOJ #6029」「雅礼集训 2017」市场
\(\mathcal{Description}\) Link. 维护序列 \(\lang a_n\rang\),支持 \(q\) 次如下操作: 区间加法: 区间下取整除法: 区间求最小值: 区 ...
- @loj - 2977@ 「THUSCH 2017」巧克力
目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...
随机推荐
- JVM 诊断神器-Arthas实战
什么是Arthas(阿尔萨斯) 阿里开源的Java诊断工具,它可以在运行时对Java应用程序进行动态诊断和调试 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决 这个类从哪个 jar 包加 ...
- WPF中登录接口
通过获取文本将json字符串转化成对象并做好相应的匹配 步骤 获取相应的文本 json字符串转化对象 json转化成实体类 参考链接:https://www.sojson.com/json2cshar ...
- Apikit SaaS 10.9.0 版本更新: 接口测试支持通过 URL 请求大型文件,支持导出为 Postman 格式文件
Hi,大家好! Eolink Apikit 即将在 2023年 6月 8日晚 18:00 开始更新 10.9.0 版本.本次版本更新主要是对多个应用级资源合并,并基于此简化付费套餐和降低费率. 本次应 ...
- 手牵手带你实现mini-vue
1 前言 随着 Vue.React.Angularjs 等框架的诞生,数据驱动视图的理念也深入人心,就 Vue 来说,它拥有着双向数据绑定.虚拟dom.组件化.视图与数据相分离等等造福程序员的优点,那 ...
- 页面status:500,报错 server encountered an internal error that prevented it from fulfilling this request.
The server encountered an internal error that prevented it from fulfilling this request.服务器遇到了一个内部错误 ...
- Python与TensorFlow:如何高效地构建和训练机器学习模型
目录 标题:<Python 与 TensorFlow:如何高效地构建和训练机器学习模型> 一.引言 随着人工智能的快速发展,机器学习作为其中的一个重要分支,受到了越来越多的关注和应用.而P ...
- 玉 - Sliver
基操 1.启动服务端 ./sliver-server_linux 2.启用多客户端协同 new-operator --name zha0gongz1 --lhost [serverip] #生成客户端 ...
- .Net 472&6.0 Razor编译时的小差异
前言 几个月前在进行着.Net 472到6.0的升级,复用原有代码,在对Razor进行迁移中,发现原运行正常的代码,却存在报错,深入研究发现是Core下对Razor编译有一些变动. 问题复现 472 ...
- 使用Canal同步mysql数据到es
一.简介 Canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7 ...
- jQuery入口函数测试
<script src="js/jquery-1.12.4.js"></script><script> window.onload = func ...