写码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]睡觉困难综合症的更多相关文章

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

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

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

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

  3. [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症

    来自FallDream的博客,未经允许,请勿转载,谢谢. 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综 ...

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

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

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

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

  6. 洛谷P3613 睡觉困难综合征

    传送门 题解 人生第一道由乃…… 做这题之前应该先去把这一题给切掉->这里 我的题解->这里 然后先膜一波zsy大佬和flashhu大佬 大体思路就是先吧全0和全1的都跑答案,然后按位贪心 ...

  7. 洛谷P2114 起床困难综合症【位运算】【贪心】

    题目:https://www.luogu.org/problemnew/show/P2114 题意:有n个操作,每个可以是与.或.异或 一个数. 初始值是0~m之间的一个数,问经过n个运算之后,可以得 ...

  8. 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)

    这个题目还是很好啊QWQ很有纪念意义 首先,如果在序列上且是单次询问的话,就是一个非常裸的贪心了QWQ这也是NOI当时原题的问题和数据范围 我们考虑上树的话,应该怎么做? 我的想法是,对于每一位建一个 ...

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

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

随机推荐

  1. linux语句速查

    一.netstat -a或--all:显示所有连线中的Socket -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址 -c或--continuous:持续列出 ...

  2. [Spark] 05 - Spark SQL

    关于Spark SQL,首先会想到一个问题:Apache Hive vs Apache Spark SQL – 13 Amazing Differences Hive has been known t ...

  3. Codeforces Numbers 题解

    这题只需要会10转P进制就行了. PS:答案需要约分,可以直接用c++自带函数__gcd(x,y). 洛谷网址 Codeforces网址 Code(C++): #include<bits/std ...

  4. 自己动手实现智能家居之树莓派GPIO简介(Python版)

    [前言] 一个热爱技术的人一定向往有一个科技感十足的环境吧,那何不亲自实践一下属于技术人的座右铭:“技术改变世界”. 就让我们一步步动手搭建一个属于自己的“智能家居平台”吧(不要对这个名词抬杠啦,技术 ...

  5. 【Dgango】模版

    继承 ① extends用法:只继承一个模版 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  6. 基于Docker搭建大数据集群(五)Mlsql部署

    主要内容 mlsql部署 前提 zookeeper正常使用 spark正常使用 hadoop正常使用 安装包 微云下载 | tar包目录下 mlsql-cluster-2.4_2.11-1.4.0.t ...

  7. 一个有意思的js块作用域问题

    1.问题 首先把问题放出来,昨天看了一个掘友发的一个问题,然后跟我同事一起研究了一下,没找出来是为什么,然后我回来一直在想为什么,然后各种找资料研究,从各个方面找为什么,比如js上下文,作用域,js垃 ...

  8. IPv6系列-彻底弄明白有状态与无状态配置IPv6地址

    深入研究自动分配IPv6地址的Stateless(无状态)与Stateful(有状态)方式 小慢哥的原创文章,欢迎转载 目录 ▪ 一. Link-Local Address的生成方式 ▪ 二. Glo ...

  9. THINKPHP 中关联查询(多表查询)

    THINKPHP 中关联查询(多表查询)可以使用 table() 方法或和join方法,请看示例: 1.Table方法:定义要操作的数据表名称,可以动态改变当前操作的数据表名称,需要写数据表的全名,包 ...

  10. Shell之Xargs命令

    目录 Shell之Xargs命令 参考 xargs命令简介 xargs命令格式 xargs实例说明 Shell之Xargs命令