洛谷 P5607 [Ynoi2013] 无力回天 NOI2017
人生第一道Ynoi,开心
Description
https://www.luogu.com.cn/problem/P5607
Solution
拿到这个题,看了一下,发现询问要求最大异或和,怎么办?
没办法,我只学过线性基,就顺着这个思路硬上吧。
我们开一颗线段树,里面的节点存线性基,那么空间复杂度是\(O(n \log v)\)的
先不管修改操作,那么我们容易分析得到单次查询的复杂度是\(O(\log n \log^2 v)\)
这个复杂度一看就是正解,接着想修改
区间\(\text{xor}\)还得维护线性基???什么鬼???
我们想,区间\(\text{xor}\)在线段树上难以办到,但是单点\(\text{xor}\)很简单
怎么办?
差分啊!!!
但我们怎么差分才能保证正确性呢?
熟知,对于一个数列\(a_n\)
如果我们把它差分,使得\(b_1 = a_1, b_i = a_i \text{xor} a_{i-1} (i>1)\)
那么由线性代数基础知识,数列\(b_n\)的线性基和原数列的线性基是一样的
这启发我们线段树维护差分的线性基,然后再单独维护\(a\),询问时将\(a\)插入线段树查询得到的线性基、
这个\(a\)就很好维护了,直接上线段树或者树状数组维护差分即可
这样,单次修改复杂度为\(O(\log n \log v)\)
Code
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 50010;
int n, m, a[N], b[N], opt, l, r, v;
inline int read() {
int res = 0, flag = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') flag = 1;
for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch ^ 48);
if(flag) res = ~res + 1;
return res;
}
struct LineBase{
int a[31];
inline void clear() {for(int i = 0; i < 31; ++i) a[i] = 0;}
inline void insert(int x) {
for(int i = 30; i + 1; --i)
if(x & (1 << i))
if(!a[i]) {a[i] = x; break;}
else x ^= a[i];
}
}O;
inline LineBase merge(LineBase x, LineBase y) {
for(int i = 30; i + 1; --i) if(y.a[i]) x.insert(y.a[i]);
return x;
}
struct SegmentTree{
#define lc (k << 1)
#define rc (lc | 1)
#define mid (l + r >> 1)
LineBase tr[N << 2];
inline void update(int k) {tr[k] = merge(tr[lc], tr[rc]);}
inline void build(int k, int l, int r) {
if(l == r) {tr[k].insert(b[l]); return;}
build(lc, l, mid), build(rc, mid + 1, r), update(k);
}
inline void modify(int k, int l, int r, int loc) {
if(l > loc || r < loc) return ;
if(l == r) {tr[k].clear(), tr[k].insert(b[l]); return;}
modify(lc, l, mid, loc), modify(rc, mid + 1, r, loc), update(k);
}
inline LineBase query(int k, int l, int r, int L, int R) {
if(l > R || r < L) return O;
if(L <= l && r <= R) return tr[k];
return merge(query(lc, l, mid, L, R), query(rc, mid + 1, r, L, R));
}
}s;
struct BIT{
#define lowbit(x) (x & -x)
int tr[N];
inline void insert(int x, int v) {for(; x <= n; x += lowbit(x)) tr[x] ^= v;}
inline int query(int x) {int res = 0; for(; x; x -= lowbit(x)) res = res ^ tr[x]; return res;}
}bit;
inline void out(int x) {
int flag = 0;
for(int i = 30; i + 1; --i)
if(flag) printf("%d",((x & (1 << i)) > 0));
else if(x & (1 << i)) printf("1"), flag = 1;
if(!flag) printf("0");
}
int main() {
n = read(), m = read();
for(int i = 1; i <= n; ++i) a[i] = read(), b[i] = a[i] ^ a[i - 1], bit.insert(i, b[i]); b[n + 1] = a[n];
s.build(1, 1, n + 1);
for(int i = 1; i <= m; ++i) {
opt = read(), l = read(), r = read(), v = read();
if(opt == 1) {
b[l] ^= v, b[r + 1] ^= v;
bit.insert(l, v), bit.insert(r + 1, v);
s.modify(1, 1, n + 1, l), s.modify(1, 1, n + 1, r + 1);
}
else {
LineBase ans = s.query(1, 1, n + 1, l + 1, r);
ans.insert(bit.query(l));
for(int j = 30; j + 1; --j) if((ans.a[j] ^ v) > v) v ^= ans.a[j];
printf("%d\n",v);
}
}
return 0;
}
洛谷 P5607 [Ynoi2013] 无力回天 NOI2017的更多相关文章
- BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...
- BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...
- BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...
- 洛谷3825 [NOI2017]游戏 2-sat
原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...
- 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...
- 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】
UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- 洛谷 P1843 奶牛晒衣服
题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 . 于是 , 为牛宝宝洗晒衣服就成了很不爽的事情. 题目描述 熊大妈请你帮助完成这个重任 . 洗完衣服后 , 你就要弄干衣服 . 衣服在自然条件下用 ...
- 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓
题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...
随机推荐
- Shell 编程基础语法
# shell脚本 # 如何运行shell脚本 sh test.sh source test.sh ./test.sh # 需要有执行权限 # source和其他两种的区别是.source不会开新进程 ...
- 海豚调度直播来了 - 即将发版的1.3.0新特性及Roadmap路线
在过去的3个多月,Apache DolphinScheduler(incuating)和DolphinScheduler社区发生了很多变化,今晚19:30在线直播将为大家介绍最新1.3.0的新特性及R ...
- Linux 05 口令字文件
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 由于 /e ...
- 面试常问:HTTP 1.0 和 HTTP 1.1 有什么区别?
这篇文章会从下面几个维度来对比 HTTP 1.0 和 HTTP 1.1: 响应状态码 缓存处理 连接方式 Host头处理 带宽优化 响应状态码 HTTP/1.0仅定义了16种状态码.HTTP/1.1中 ...
- Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...
- virsh edit 很慢 的bug
创建虚拟机,发现virsh edit很慢. strace的结果: 09:26:03 close(10) = -1 EBADF (Bad file descriptor)09:26:03 close(1 ...
- 未关中断情况下的hardlock
最近遇到一例crash,3.10内核,hardlock,查看对应的堆栈,中断是使能的. 查看对应的hrtimer_interrupts和hrtimer_interrupt_save的值,发现确实相等. ...
- Matery主题添加Pjax
如何给matery主题添加Pjax? Pjax优点 1.减轻服务端压力 2.按需请求,每次只需加载页面的部分内容,而不用重复加载一些公共的资源文件和不变的页面结构,大大减小了数据请求量,以减轻对服务器 ...
- ServletFileUpload 文件上传
import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadExcepti ...
- 【MySQL】从入门到掌握1-一些背景知识
这个系列的文章带各位学习MySQL数据库. 不需要任何基础知识,便可以学习. 学习MySQL对学习Java的JDBC有很大的好处! 想要开发游戏服务器,那么学习MySQL也是必不可少的. 学习完本系列 ...