[洛谷P3613]睡觉困难综合症
写码30min,调码3h的题。。
好在最后查出来了
else T.modify(, , n, x, y, z);
改成了
else T.modify(, , n, mark[x], y, z);
然后$40\rightarrow 100$
#include <bits/stdc++.h> using namespace std; #define re register
#define rep(i, a, b) for (re int i = a; i <= b; ++i)
#define repd(i, a, b) for (re int i = a; i >= b; --i)
#define For(i, a, b, s) for (re int i = a; i <= b; s)
#define maxx(a, b) a = max(a, b)
#define minn(a, b) a = min(a, b)
#define LL long long
#define INF (1 << 30) #define Finline __inline__ __attribute__ ((always_inline))
extern Finline char get_char(){
static char buf[], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, , , stdin), p1 == p2) ? EOF : *p1 ++;
} template <typename T>
inline void read(T &w) {
w = ; char c = get_char();
while (!isdigit(c)) c = get_char();
while (isdigit(c)) w = (w << ) + (w << ) + (c ^ ), c = get_char();
} const int maxn = 1e5 + ; int n, m, k; struct Node {
unsigned LL v;
int opt;
} a[maxn], b[maxn]; struct Edge {
int u, v, pre;
} e[maxn << ];
int ec, G[maxn];
void init() { ec = ; memset(G, -, sizeof(G)); }
void add(int u, int v) { e[ec++] = (Edge){u, v, G[u]}; G[u] = ec-; }
#define iter(i, u) for (register int i = G[u]; i != -1; i = e[i].pre) int par[maxn], topf[maxn], son[maxn], link[maxn], mark[maxn], dep[maxn], cnt;
void dfs1(int u, int fa) {
par[u] = fa; son[u] = ; link[u] = u; dep[u] = dep[fa]+;
iter(i, u)
if (e[i].v != fa) {
dfs1(e[i].v, u);
if (son[e[i].v] >= son[link[u]]) link[u] = e[i].v;
son[u] += son[e[i].v];
}
}
void dfs2(int u, int fa, int head) {
mark[u] = ++cnt; topf[u] = head; a[cnt] = b[u];
if (link[u] != u) dfs2(link[u], u, head);
iter(i, u)
if (e[i].v != fa && e[i].v != link[u])
dfs2(e[i].v, u, e[i].v);
}
// opt: 1->& 2->| 3->^
inline unsigned LL calc(unsigned LL a, unsigned LL b, int opt) {
if (opt == ) return a & b;
else if (opt == ) return a | b;
else return a ^ b;
} #define connect(v, a, b) (((v)&(b))|(~(v)&(a))) struct Seg_T {
#define lson (o << 1)
#define rson (o << 1 | 1)
unsigned LL l0[maxn << ], l1[maxn << ], r0[maxn << ], r1[maxn << ];
void pushup(int o) {
l0[o] = connect(l0[lson], l0[rson], l1[rson]);
l1[o] = connect(l1[lson], l0[rson], l1[rson]);
r0[o] = connect(r0[rson], r0[lson], r1[lson]);
r1[o] = connect(r1[rson], r0[lson], r1[lson]);
}
void build(int o, int l, int r) {
if (l == r) {
l0[o] = r0[o] = calc((unsigned LL), a[l].v, a[l].opt);
l1[o] = r1[o] = calc(~(unsigned LL), a[l].v, a[l].opt);
return;
}
int mid = (l + r) >> ;
build(lson, l, mid), build(rson, mid+, r);
pushup(o);
}
void modify(int o, int l, int r, int p, int opt, unsigned LL v) {
if (l == r) {
l0[o] = r0[o] = calc((unsigned LL), v, opt);
l1[o] = r1[o] = calc(~(unsigned LL), v, opt);
return;
}
int mid = (l + r) >> ;
if (p <= mid) modify(lson, l, mid, p, opt, v); else modify(rson, mid+, r, p, opt, v);
pushup(o);
}
void lquery(int o, int l, int r, int ql, int qr, unsigned LL &L0, unsigned LL &L1) {
if (ql <= l && r <= qr) {
L0 = connect(L0, l0[o], l1[o]);
L1 = connect(L1, l0[o], l1[o]);
return;
}
int mid = (l + r) >> ;
if (ql <= mid) lquery(lson, l, mid, ql, qr, L0, L1);
if (mid < qr) lquery(rson, mid+, r, ql, qr, L0, L1);
}
void rquery(int o, int l, int r, int ql, int qr, unsigned LL &R0, unsigned LL &R1) {
if (ql <= l && r <= qr) {
R0 = connect(R0, r0[o], r1[o]);
R1 = connect(R1, r0[o], r1[o]);
return;
}
int mid = (l + r) >> ;
if (mid < qr) rquery(rson, mid+, r, ql, qr, R0, R1);
if (ql <= mid) rquery(lson, l, mid, ql, qr, R0, R1);
}
} T; #define swap(a, b) a ^= b ^= a ^= b
int s[maxn], size = ; unsigned LL query_link(int x, int y, unsigned LL z) {
unsigned LL l0 = , l1 = ~l0, r0 = , r1 = ~r0;
while (topf[x] != topf[y]) {
if (dep[topf[x]] > dep[topf[y]]) {
T.rquery(, , n, mark[topf[x]], mark[x], l0, l1);
x = par[topf[x]];
} else {
unsigned LL l = , r = ~l;
T.lquery(, , n, mark[topf[y]], mark[y], l, r);
l = connect(l, r0, r1);
r = connect(r, r0, r1);
r0 = l, r1 = r;
y = par[topf[y]];
}
}
if (dep[x] > dep[y]) T.rquery(, , n, mark[y], mark[x], l0, l1);
else T.lquery(, , n, mark[x], mark[y], l0, l1);
l0 = connect(l0, r0, r1); l1 = connect(l1, r0, r1);
int flag = ; unsigned LL res = , bit;
repd(i, k-, ) {
bit = (unsigned LL) << i;
if (l0 & bit) res |= bit;
if (flag) {
if (z & bit) {
if (!(l0 & bit) && (l1 & bit)) res |= bit;
else flag = ;
}
} else
if (!(l0 & bit) && (l1 & bit)) res |= bit;
}
return res;
} int main() {
init();
read(n), read(m), read(k);
rep(i, , n) read(b[i].opt), read(b[i].v);
rep(i, , n-) {
int u, v; read(u), read(v);
add(u, v), add(v, u);
}
dfs1(, ), dfs2(, , );
T.build(, , n);
rep(i, , m) {
int Q, x, y; unsigned LL z; read(Q), read(x), read(y), read(z);
if (Q == ) printf("%llu\n", query_link(x, y, z));
else T.modify(, , n, mark[x], y, z);
}
return ;
}
[洛谷P3613]睡觉困难综合症的更多相关文章
- 洛谷P3613 睡觉困难综合征(LCT)
题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...
- 洛谷P3613 睡觉困难综合征(LCT,贪心)
洛谷题目传送门 膜拜神犇出题人管理员!!膜拜yler和ZSY!! 没错yler连续教我这个蒟蒻写起床困难综合症和睡觉困难综合症%%%Orz,所以按位贪心的思路可以继承下来 这里最好还是写树剖吧,不过我 ...
- [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症
来自FallDream的博客,未经允许,请勿转载,谢谢. 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综 ...
- 【刷题】洛谷 P3613 睡觉困难综合征
题目背景 刚立完Flag我就挂了WC和THUWC... 时间限制0.5s,空间限制128MB 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目 ...
- [洛谷]P3613 睡觉困难综合征
题目大意:给出一棵n个点的树,每个点有一个运算符(与.或.异或)和一个数,支持两种操作,第一种修改一个点的运算符和数,第二种给出x,y,z,询问若有一个0~z之间的数从点x走到点y(简单路径),并且对 ...
- 洛谷P3613 睡觉困难综合征
传送门 题解 人生第一道由乃…… 做这题之前应该先去把这一题给切掉->这里 我的题解->这里 然后先膜一波zsy大佬和flashhu大佬 大体思路就是先吧全0和全1的都跑答案,然后按位贪心 ...
- 洛谷P2114 起床困难综合症【位运算】【贪心】
题目:https://www.luogu.org/problemnew/show/P2114 题意:有n个操作,每个可以是与.或.异或 一个数. 初始值是0~m之间的一个数,问经过n个运算之后,可以得 ...
- 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)
这个题目还是很好啊QWQ很有纪念意义 首先,如果在序列上且是单次询问的话,就是一个非常裸的贪心了QWQ这也是NOI当时原题的问题和数据范围 我们考虑上树的话,应该怎么做? 我的想法是,对于每一位建一个 ...
- P3613 睡觉困难综合征(LCT + 位运算)
题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...
随机推荐
- Hadoop 之 HDFS的使用
1.列出hadoop下面的目录, hadoop fs -ls / 进入user hadoop fs ls /user 2.再usr/root下新建input目录 hadoop -mkdir inpu ...
- 在linux服务器上装svn版本管理,自动部署代码到web项目
在linux服务器上装svn版本管理,自动部署代码到项目 1.安装svn服务器端 yum install subversion 从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认 ...
- BUG 的生命周期
BUG 的生命周期 Bug-->软件程序的漏洞或缺陷 Bug 的类型:代码错误.设计缺陷.界面优化.性能问题.配置相关.安装部署.安全相关.标准规划.测试脚本....其他(功能类.界面类.性能类 ...
- sql server编写archive通用模板脚本实现自动分批删除数据
博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常 ...
- Save&Load--Unity存档读档的学习总结
存档与读档功能 举例: 传统RPG游戏(仙剑.空之轨迹): 1.角色信息(生命值,等级) 2.道具信息(装备,药品) 3.场景信息(场景名称.角色坐标) 4.事件信息(任务相关) 关卡类游戏:关卡的通 ...
- 使用ImageIO.write上传二维码文件时候,提示系统找不到指定路径
报错如图所示: java.io.FileNotFoundException: E:\SF\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtp ...
- 通过父级id获取到其下所有子级(无穷级)——Mysql函数实现
[需求]某用户只能查看其自己信息及其下级信息,涉及通过该用户所在部门获取其下所有部门(多层)id集合. 步骤一:对数据库进行设置: set global log_bin_trust_function_ ...
- Java 基本数据类型极限值
public static void main(String[] args){ System.out.println("Integer.MIN_VALUE = " + Intege ...
- java面向对象,数据类型深入
java程序员面试题day02 1.类和对象有什么区别? java中的类通过class关键字进行定义,代表的是一种抽象的集合,在类中可以定义各种的属性和方法,代表的是每一个类的实例的特定的数据和动作, ...
- openstack问题记录
先去查看对应的日志:/var/log/,再来排查错误 1.实例处于错误状态 解决办法: 1.使用openstack hypervisor list查看 2.然后openstack hypervisor ...