题目大意:[NOI2014]起床困难综合症加强版,出到树上,$m(m\leqslant10^5)$组询问,带修改,数的范围$<2^{64})$

题解:先想到树剖,转化为序列问题,线段树维护区间从左到右和从右到左$01$变化值,然后发现如果对每一位考虑,复杂度为$O(64n\log_2^2n)$,$0.5s$时限并过不去。考虑去掉$k$,可以使用位运算来$O(1)$合并区间。

注意树剖询问的时候要按顺序修改,不可以反过来。

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#include <cctype>
namespace __IO {int x, ch;inline int read() {while (isspace(ch = getchar())) ;for (x = ch & 15; isdigit(ch = getchar()); ) x = x * 10 + (ch & 15);return x;}unsigned long long X;inline unsigned long long readllu() {while (isspace(ch = getchar())) ;for (X = ch & 15; isdigit(ch = getchar()); ) X = X * 10 + (ch & 15);return X;}
}
using __IO::read;
using __IO::readllu;const int maxn = 100010;
const unsigned long long inf = ~0;int Opt[maxn], __Opt[maxn];
unsigned long long Num[maxn], __Num[maxn];
int n, m, __p;
inline void calc(unsigned long long &x, int y, unsigned long long z) {switch (y) {case 1: x &= z; break;case 2: x |= z; break;case 3: x ^= z;}
}
struct node {unsigned long long __0, __1;inline friend node operator + (const node &lhs, const node &rhs) {return (node) {(lhs.__0 & rhs.__1) | (~lhs.__0 & rhs.__0),(lhs.__1 & rhs.__1) | (~lhs.__1 & rhs.__0)};}
} ;
namespace SgT {const int N = maxn << 2;node lr[N], rl[N];void build(const int rt, const int l, const int r) {if (l == r) {calc(lr[rt].__0 = 0, Opt[l], Num[l]);calc(lr[rt].__1 = inf, Opt[l], Num[l]);calc(rl[rt].__0 = 0, Opt[l], Num[l]);calc(rl[rt].__1 = inf, Opt[l], Num[l]);return ;}const int mid = l + r >> 1, lc = rt << 1, rc = rt << 1 | 1;build(lc, l, mid), build(rc, mid + 1, r);lr[rt] = lr[lc] + lr[rc];rl[rt] = rl[rc] + rl[lc];}int pos;void __modify(const int rt, const int l, const int r) {if (l == r) {calc(lr[rt].__0 = 0, Opt[l], Num[l]);calc(lr[rt].__1 = inf, Opt[l], Num[l]);calc(rl[rt].__0 = 0, Opt[l], Num[l]);calc(rl[rt].__1 = inf, Opt[l], Num[l]);return ;}const int mid = l + r >> 1, lc = rt << 1, rc = rt << 1 | 1;if (pos <= mid) __modify(lc, l, mid);else __modify(rc, mid + 1, r);lr[rt] = lr[lc] + lr[rc];rl[rt] = rl[rc] + rl[lc];}void modify(int __pos, int y, unsigned long long z) {pos = __pos;Opt[pos] = y;Num[pos] = z;__modify(1, 1, n);}int L, R;node res;void querylr(const int rt, const int l, const int r) {if (L <= l && R >= r) {res = res + lr[rt];return ;}const int mid = l + r >> 1;if (L <= mid) querylr(rt << 1, l, mid);if (R > mid) querylr(rt << 1 | 1, mid + 1, r);}void queryrl(const int rt, const int l, const int r) {if (L <= l && R >= r) {res = res + rl[rt];return ;}const int mid = l + r >> 1;if (R > mid) queryrl(rt << 1 | 1, mid + 1, r);if (L <= mid) queryrl(rt << 1, l, mid);}node query(int __L, int __R) {res.__0 = 0, res.__1 = inf;if (__L <= __R) {L = __L, R = __R;querylr(1, 1, n);} else {L = __R, R = __L;queryrl(1, 1, n);}return res;}
}int head[maxn], cnt;
struct Edge {int to, nxt;
} e[maxn << 1];
inline void addedge(int a, int b) {e[++cnt] = (Edge) { b, head[a] }; head[a] = cnt;e[++cnt] = (Edge) { a, head[b] }; head[b] = cnt;
}int fa[maxn], dep[maxn], sz[maxn];
int dfn[maxn], idx, top[maxn], son[maxn];
void dfs1(int u) {sz[u] = 1;for (int i = head[u]; i; i = e[i].nxt) {int v = e[i].to;if (v != fa[u]) {fa[v] = u;dep[v] = dep[u] + 1;dfs1(v);if (!son[u] || sz[v] > sz[son[u]]) son[u] = v;sz[u] += sz[v];}}
}
void dfs2(int u) {dfn[u] = ++idx;int v = son[u];if (v) top[v] = top[u], dfs2(v);for (int i = head[u]; i; i = e[i].nxt) {int v = e[i].to;if (v != fa[u] && v != son[u]) {top[v] = v;dfs2(v);}}
}unsigned long long query(int x, int y, unsigned long long z) {static node res, S[maxn];int tot = 0;res.__0 = 0, res.__1 = inf;while (top[x] != top[y]) {if (dep[top[x]] > dep[top[y]]) {res = res + SgT::query(dfn[x], dfn[top[x]]);x = fa[top[x]];} else {S[++tot] = SgT::query(dfn[top[y]], dfn[y]);y = fa[top[y]];}}res = res + SgT::query(dfn[x], dfn[y]);while (tot) res = res + S[tot--];unsigned long long ans = 0, ret = 0;for (int i = 63; ~i; --i) {if (res.__0 >> i & 1) ret |= 1ull << i;else if (res.__1 >> i & 1) {if ((ans | 1ull << i) <= z) {ans |= 1ull << i;ret |= 1ull << i;}}}return ret;
}int main() {n = read(), m = read(), __p = read();for (int i = 1; i <= n; ++i) {__Opt[i] = read(), __Num[i] = readllu();}for (int i = 1, a, b; i < n; ++i) {a = read(), b = read();addedge(a, b);}dfs1(1), dfs2(top[1] = 1);for (int i = 1; i <= n; ++i) Opt[dfn[i]] = __Opt[i], Num[dfn[i]] = __Num[i];SgT::build(1, 1, n);while (m --> 0) {static int op, x, y;static unsigned long long z;op = read(), x = read(), y = read(), z = readllu();if (op == 1) {printf("%llu\n", query(x, y, z));} else {SgT::modify(dfn[x], y, z);}}return 0;
}

转载于:https://www.cnblogs.com/Memory-of-winter/p/10286499.html

[洛谷P3613]睡觉困难综合征相关推荐

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

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

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

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

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

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

  4. [Luogu P3613] 睡觉困难综合征

    洛谷传送门 题目描述 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目世界被破坏殆尽,所以由乃和雪辉天天都忙着重建世界(其实和MC差不多吧), ...

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

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

  6. 数组——寄包柜(洛谷 P3613)

    题目选自洛谷P3613 比入门稍微麻烦了一点,该题主要为了理解用vector如何创建二维数组及其引用对应的值. 解题代码: #include<stdio.h> #include<io ...

  7. 洛谷 P3613 【深基15.例2】寄包柜

    [题目链接] 洛谷 P3613 [深基15.例2]寄包柜 [题目考点] 1. STL map 2. STL pair pair<T1, T2> make_pair(T1 a, T2 b); ...

  8. 洛谷P3613 寄包柜

    题目描述 超市里有 n(n\le10^5)n(n≤105) 个寄包柜.每个寄包柜格子数量不一,第 ii 个寄包柜有 a_i(a_i\le10^5)ai​(ai​≤105) 个格子,不过我们并不知道各个 ...

  9. 【题解】洛谷P2114 [NOI2014]起床困难综合症

    前往:我自己搭建的博客 题目 洛谷P2114 [NOI2014]起床困难综合症 题解 题意简化为:在0~m之间找一个数,使得这个数在一系列操作后最大. 由于原数有大小限制,又要使得到的数尽量大,为了充 ...

  10. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. attachEvent 与addEventListener到底有什么区别呢?
  2. linux内核启动时间优化
  3. linux 8051 编译,[编译] 3、在Linux下搭建51单片机的开发烧写环境(makefile版)
  4. python断言assertequal_python-尝试断言AlmostEqual / assertEqual时,不受支持的操作数类型...
  5. 把庞大的 npm script 拆到单独文件中
  6. 【华为云技术分享】HDC.Cloud|华为云Stack大咖说:如何实现微服务架构下的分布式事务
  7. 计算机图形系统基本处理流程,计算机图形系统是进行图形处理的计算机系统-read.ppt...
  8. oracle级联赋权,Oracle 级联with admin option 和 with grant option
  9. Vue报错:npm run start npm ERR! missing script: start
  10. 【Qt串口调试助手】1.8 - 修改Qt应用图标和窗口图标
  11. android 4.3以上修改DNS流程(netd)
  12. 如何开发神经网络来预测汽车保险支出
  13. 【DCTWVRP】基于matlab遗传算法求解带容量+距离+时间窗的车辆路径规划问题【含Matlab源码 1211期】
  14. lisp用entmake生产圆柱体_液态基酒生产
  15. svn update中断,报cleanup错误
  16. 《动手学深度学习》Mxnet环境搭建
  17. chm 已取消到该网页的导航,打不开
  18. python方波绘制_怎么用python 画出任意占空比的一串矩形方波呢?
  19. 移动磁盘数据错误循环冗余检查,要怎样恢复数据
  20. MQTT在线公共的MQTT服务器

热门文章

  1. Kubernetes可以代替Docker,可笑
  2. matlab光流彩图,hs 用matlab编译的经典光流算法HS ,附有程序需 图像 238万源代码下载- www.pudn.com...
  3. DeepMatch推荐系统中的常用算法——Youtube的DeepMatch
  4. 逻辑回归与线性回归是什么关系呢?
  5. Momentum动量法
  6. 数学建模——层次分析法
  7. 【知识图谱系列】知识图谱的神经符号逻辑推理
  8. Gibbs Sampling\吉布斯采样(三)
  9. 413.等差数列划分(力扣leetcode) 博主可答疑该问题
  10. 第 7 章 Neutron - 072 - 详解 ML2 Core Plugin(II)