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@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...
随机推荐
- CentOS7 本地光盘镜像rpm包
CentOS7 本地光盘镜像rpm包 一.前言 rpm包的下载方式 通过本地光盘镜像下载rpm,centos7.iso镜像文件,内置了绝大多数软件的rpm包(本文章即演示如何配置本地rpm) 在线下载 ...
- 深度解读 Linux 内核级通用内存池 —— kmalloc 体系
本文是笔者 slab 系列的最后一篇文章,为了方便大家快速检索,先将相关的文章列举出来: <细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现> <从内核源码看 sl ...
- stream流根据集合中的元素的属性进行去重的方法
public class StreamListTest { public static void main(String[] args) { List<Student> studentLi ...
- Linux系统运维之MYSQL数据库集群部署(主从复制)
一.介绍 Mysql主从复制,前段时间生产环境部署了一套主从复制的架构,当时现找了很多资料,现在记录下 二.拓扑图 三.环境以及软件版本 主机名 IP 操作系统 角色 软件版本 MysqlDB_Mas ...
- 在linux上启动arthas报“Can not find java process”
发生背景 完整报错信息: [***@localhost ~]$ java -jar arthas-boot.jar [INFO] JAVA_HOME: /usr/lib/jvm/java-1.8.0- ...
- .NET Core 允许跨域的两种方式实现(IIS 配置、C# 代码实现)
〇.前言 当把开发好的 WebApi 接口,部署到 Windows 服务器 IIS 后,postman 可以直接访问到接口并正确返回,这并不意味着任务完成,毕竟接口嘛是要有交互的,最常见的问题莫过于跨 ...
- DevOps | 产研协同效能提升之评审、审批流、质量卡点
研发过程中有各种需求的评审.审批流和质量卡点,有的是为了质量把关,有的是为了彰显权力,还有一些是为了信息告知.本文主要讨论在软件开发过程中涉及的评审.审批和质量卡点三种情况,同时探讨对研发流程的影响, ...
- 压缩CSS样式与js样式
方法一: 使用插件:JS & CSS Minifier (Minify) 使用方法: 效果: 或者按下F1,输入命令:Minify:Document
- 仅三天,我用 GPT-4 生成了性能全网第一的 Golang Worker Pool,轻松打败 GitHub 万星项目
目录 1. 我写了一个超牛的开源项目 1.1 你看看这性能 1.2 你看看这功能 1.3 你猜我这一百天都经历了啥 2. 你有多久没写并发程序了? 3. 问:一个 Worker Pool 程序需要包含 ...
- Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs
目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明 Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改 Hi3798MV200 恩兔N2 NS ...