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@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...
随机推荐
- 一篇文章带你详细了解axios的封装
axios 封装 对请求的封装在实际项目中是十分必要的,它可以让我们统一处理 http 请求.比如做一些拦截,处理一些错误等.本篇文章将详细介绍如何封装 axios 请求,具体实现的功能如下 基本配置 ...
- ChatGPT玩法(二):AI玩转Excel表格处理
前言 在线免费体验ChatGpt:https://www.topgpt.one 你是否还在为记不住Excel的繁琐函数和公式而苦恼?如果是这样,那么不妨试试ChatExcel.即使你对函数一窍不通,也 ...
- python3使用pjsua进行呼叫测试
环境:CentOS 7.6_x64 Python版本 :3.9.12 pjsip版本:2.13 之前写过一篇CentOS7环境编译python3.9版本pjsua的文章: https://w ...
- 从零开始整SpringBoot-工具与插件
工具 工具 名称 地址 IDEA https://www.jetbrains.com/idea/ JDK1.8 https://www.oracle.com/java/technologies/jav ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-5-元素定位大法-上篇
1.简介 说到元素定位,小伙伴或者童鞋们肯定会首先想到 selenium 的八大元素定位大法.同理Playwright也有自己的元素定位的方法.今天就给小伙伴或者童鞋们讲解和分享一下Playwrigh ...
- 一文搞懂什么是 API
在我学习软件开发之前,API 听起来像是一种啤酒(IPA,印度淡色艾尔).如今我经常使用这个术语,事实上最近我还尝试在酒吧里点了一个 API,结果酒保给了我一个: 404 资源未找到的回应 无论是在科 ...
- 图像分割_评价指标_PSNR峰值信噪比和SSIM结构相似度
PSNR psnr是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价图像的客观标准. 为了衡量经过处理后的影像品质,我们通常会参考PSNR值 ...
- IRF技术介绍及配置介绍
IRF技术介绍及配置介绍 IRF(Intelligent Resilient Framework,智能弹性架构)是 H3C 自主研发的软件虚拟化技术. 它的核心思想是将多台设备通过 IRF 物理端口连 ...
- vulnhub_me and my grilfriend
解题步骤 主机nmap扫描,开放22和80端口 访问该ip,发现只能本地访问 查看源代码,提示需要使用x-forwarded-for的请求头,可以在burp suite中每次添加一个请求头,也可以使用 ...
- [golang]使用tail追踪文件变更
简介 借助 github.com/hpcloud/tail ,可以实时追踪文件变更,达到类似shell命令tail -f的效果. 示例代码 以下示例代码用于实时读取nginx的access.log日志 ...