传送门:https://www.luogu.org/problem/show?pid=3613

【题解】

按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做。

写棵LCT,维护正反两种权值,每个维护2种,代表全0的输出和全1的输出。

然后直接上LCT即可。

权值的合并有点trick,可以参考代码,需要压位。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 1e5 + ;
const int mod = 1e9+; int n, m, K; struct node {
ull p0, p1;
node () {}
node (ull p0, ull p1) : p0(p0), p1(p1) {}
friend node operator + (node a, node b) {
return node( (a.p0 & b.p1) | ((~a.p0) & b.p0), (a.p1 & b.p1) | ((~a.p1) & b.p0) );
}
}; inline node deal(int op, ull x) {
if(op == ) return node(, x);
if(op == ) return node(x, ull(-));
if(op == ) return node(x, ~x);
} struct LCT {
int ch[M][], fa[M];
bool rev[M];
node w[M][], val[M];
# define ls ch[x][]
# define rs ch[x][]
inline void up(int x) {
if(!x) return ;
w[x][] = w[x][] = val[x];
if(ls) w[x][] = w[ls][] + w[x][], w[x][] = w[x][] + w[ls][];
if(rs) w[x][] = w[x][] + w[rs][], w[x][] = w[rs][] + w[x][];
}
inline void pushrev(int x) {
if(!x) return ;
rev[x] ^= ;
swap(ch[x][], ch[x][]);
swap(w[x][], w[x][]);
}
inline void down(int x) {
if(!x || !rev[x]) return ;
pushrev(ls); pushrev(rs);
rev[x] = ;
}
# undef ls
# undef rs
inline bool isrt(int x) {
return ch[fa[x]][] != x && ch[fa[x]][] != x;
}
inline void rotate(int x) {
int y = fa[x], z = fa[y], ls = ch[y][] == x, rs = ls^;
if(!isrt(y)) ch[z][ch[z][] == y] = x;
fa[ch[x][rs]] = y, fa[y] = x, fa[x] = z;
ch[y][ls] = ch[x][rs]; ch[x][rs] = y;
up(y); up(x);
}
int st[M];
inline void splay(int x) {
int stn = , tx = x;
while(!isrt(tx)) st[++stn] = tx, tx = fa[tx];
st[++stn] = tx;
for (int i=stn; i; --i) down(st[i]);
while(!isrt(x)) {
int y = fa[x], z = fa[y];
if(!isrt(y)) {
if((ch[z][] == y)^(ch[y][] == x)) rotate(x);
else rotate(y);
}
rotate(x);
}
} inline int access(int x) {
int t = ;
for (; x; t = x, x = fa[x]) {
splay(x);
ch[x][] = t;
up(x);
}
return t;
} inline void makeroot(int x) {
access(x); splay(x); pushrev(x);
} inline void link(int x, int y) {
makeroot(y); fa[y] = x;
}
}T; # define bit(x, i) (((x) >> (i)) & ) int main() {
// freopen("sleep.in", "r", stdin);
// freopen("sleep.out", "w", stdout);
scanf("%d%d%d", &n, &m, &K);
for (int i=, op; i<=n; ++i) {
ull x;
scanf("%d%llu", &op, &x);
T.val[i] = T.w[i][] = T.w[i][] = deal(op, x);
T.ch[i][] = T.ch[i][] = T.fa[i] = T.rev[i] = ;
}
for (int i=, u, v; i<n; ++i) {
scanf("%d%d", &u, &v);
T.link(u, v);
}
int op, x, y; ull z, tx, ty, ans, t;
while(m--) {
scanf("%d%d%d%llu", &op, &x, &y, &z);
if(op == ) {
ans = ; t = ;
T.makeroot(x); T.access(y); T.splay(y);
tx = T.w[y][].p0, ty = T.w[y][].p1;
for (int i=; ~i; --i) {
if(bit(tx, i)) ans |= (1ull << i);
else if(bit(ty, i)) {
if(t + (1ull << i) <= z) t = t + (1ull << i), ans |= (1ull << i);
}
}
printf("%llu\n", ans);
} else {
T.splay(x);
T.val[x] = deal(y, z);
T.up(x);
}
}
return ;
}

省队集训Day1 睡觉困难综合征的更多相关文章

  1. 【刷题】洛谷 P3613 睡觉困难综合征

    题目背景 刚立完Flag我就挂了WC和THUWC... 时间限制0.5s,空间限制128MB 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目 ...

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

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

  3. Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心

    传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...

  4. 洛谷P3613 睡觉困难综合征(LCT,贪心)

    洛谷题目传送门 膜拜神犇出题人管理员!!膜拜yler和ZSY!! 没错yler连续教我这个蒟蒻写起床困难综合症和睡觉困难综合症%%%Orz,所以按位贪心的思路可以继承下来 这里最好还是写树剖吧,不过我 ...

  5. 洛谷P3613 睡觉困难综合征(LCT)

    题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...

  6. Luogu3613 睡觉困难综合征

    题面描述https://www.luogu.org/problemnew/show/3613 原题NOI2014起床困难综合症https://www.luogu.org/problemnew/show ...

  7. P3613 睡觉困难综合征(LCT + 位运算)

    题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...

  8. FJ省队集训DAY1 T1

    题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...

  9. [洛谷]P3613 睡觉困难综合征

    题目大意:给出一棵n个点的树,每个点有一个运算符(与.或.异或)和一个数,支持两种操作,第一种修改一个点的运算符和数,第二种给出x,y,z,询问若有一个0~z之间的数从点x走到点y(简单路径),并且对 ...

随机推荐

  1. Alpha 冲刺(3/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助后端界面的开发 搭建项目运行的服务器环境 ...

  2. ACM 第三天

    A - Arpa’s hard exam and Mehrdad’s naive cheat CodeForces - 742A There exists an island called Arpa’ ...

  3. LintCode-204.单例

    单例 单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计> 模式为单例.例如,对于 class Mouse (不是动物的mouse哦), ...

  4. 《学习OpenCV》课后习题解答2

    题目:(P104) 创建一个拥有三个通道的二维字节类型矩阵,大小为100*100,并将所有值赋为0.通过函数cvPtr2D将指针指向中间的通道("绿色").以(20,5)与(40, ...

  5. CentOs7.3 搭建 Redis-4.0.1 Cluster 集群服务

    环境 VMware版本号:12.0.0 CentOS版本:CentOS 7.3.1611 三台虚拟机(IP):192.168.252.101,192.168.102..102,192.168.252. ...

  6. oracle 9i 图文安装教程 oracle 9i 安装

    我的安装文件是ISO镜像文件,使用Virtual DAEMON Manager v 4.10打开: ora9i-1.iso ora9i-2.iso ora9i-3.iso 首先必须把上面三个镜像文件都 ...

  7. mstsc远程登录终端超出最大连接数的解决办法

    1,.远程服务器有两个用户登录 2.第三个登录时提示:终端服务器超出了最大允许连接,这种情况怎么解决 A.通过运行命令来解决:运行输入mstsc /admin /v:IP:端口  敲回车来解决,这里的 ...

  8. 在vue项目中使用monaco-editor

    monaco-editor: https://github.com/Microsoft/monaco-editor 在ESM中的使用官方也有对应文档:https://github.com/Micros ...

  9. Swift & Unicode

    Swift & Unicode emoji let == const https://www.runoob.com/swift/swift-basic-syntax.html

  10. jCanvaScript canvas的操作库

    在jcscript.com上下载最新的jCanvaScript.1.5.18.min.js文件  里面有很多关于canvas的方法都已经是封装好了的,只需直接调用,但是要注意调用之前和调用之后都要写: ...