人生第一道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的更多相关文章

  1. BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...

  2. BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...

  3. BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...

  4. 洛谷3825 [NOI2017]游戏 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...

  5. 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】

    题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...

  6. 洛谷 P3825 [NOI2017]游戏 【2-SAT+状压】

    UOJ和洛谷上能A,bzoj 8ms即WA,现在也不是知道为啥--因为我太弱了 先看数据范围发现d非常小,自然想到了状压. 所以先假装都是只能跑两种车的,这显然就是个2-SAT问题了:对于x场没有hx ...

  7. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  8. 洛谷 P1843 奶牛晒衣服

    题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 . 于是 , 为牛宝宝洗晒衣服就成了很不爽的事情. 题目描述 熊大妈请你帮助完成这个重任 . 洗完衣服后 , 你就要弄干衣服 . 衣服在自然条件下用 ...

  9. 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓

    题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...

随机推荐

  1. 一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_200 时光荏苒,过隙白驹,即将进入2022年,著名敏捷开发语言Python也放出了3.10最终版,本次我们来展示一下在不同的系统和 ...

  2. WPF 截图控件之画笔(八)「仿微信」

    前言 接着上周写的截图控件继续更新添加 画笔. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...

  3. Linux 的常用基本命令

    一.Linux 的常用基本命令..................................................................................... ...

  4. BZOJ3295/Luogu3157 [CQOI2011]动态逆序对 (CDQ or 树套树 )

    /* Dear friend, wanna learn CDQ? As a surprice, this code is totally wrong. You may ask, then why yo ...

  5. Luogu1919 【模板】A*B Problem升级版(FFT)

    简单的\(A*B\) \(Problem\),卡精度卡到想女装 #include <iostream> #include <cstdio> #include <cstri ...

  6. Luogu3855 [TJOI2008]Binary Land (BFS)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  7. Canvas 非线性图形(一):文本

    基础 画布除了绘制图形以外还可以绘制文本,画布中的文本可以设置字体大小.字体格式.对齐方式(横向和纵向对齐方式),并且还可以制作很炫酷的文本,比如渐变文字. 文本有以下三个属性,控制文本的字体大小.字 ...

  8. ceph 010 clustermap ceph调优

    cluster map [ceph: root@clienta /]# ceph mon dump epoch 4 fsid 2ae6d05a-229a-11ec-925e-52540000fa0c ...

  9. CCF NOI Online 2021 提高组 赛后心得

    T1 做个,不会,拿到 20 pts 跑路. 注意后面有个 K = 1 的部分分,这个可以递推求 b 的个数,然后直接乘上 a0 . 官方正解讲得极其详细,我还是第一次见到可以 O(K2) 做 1~n ...

  10. 一文快速上手 Nacos 注册中心+配置中心!

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud Alibaba 的核心 ...