【2017西安邀请赛:A】XOR(线段树+线性基)
前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇。
思路:首先分析题目
一、区间操作 —— 线段树
二、异或操作 —— 线性基
这个两个不难想,关键是下一步的技巧
“或”运算 就是两个数的二进制中,对应位 只要有1,那么就是该位结果就是 1,所以要想k“或”运算后的结果尽量大,
就需要异或出的数,各个位上的1尽量多。
线性基的操作,可以求出区间最大异或和,但是我们需要的结果是 “或”运算。
所以我们可以将 k 取反,然后把所有数在加入线性基之前,全部 “与”运算一遍,再加入线性基。
这样,线性基中的每一位,全部都是能使得k变大的数了,因为k的二进制上的每一位 1 的位置,线性基中都是0。
所以,我们只需要求, k 异或 线性基中最大异或和 。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize(2)
#include <bits/stdc++.h>
#include<unordered_set> using namespace std;
typedef double dou;
typedef long long ll;
typedef pair<int, int> pii;
typedef map<int, int> mii; #define pai acos(-1.0)
#define M 10050
#define inf 0x3f3f3f3f
#define mod 1000000007
#define IN inline
#define W(a) while(a)
#define lowbit(a) a&(-a)
#define left k<<1
#define right k<<1|1
#define lson L, mid, left
#define rson mid + 1, R, right
#define ms(a,b) memset(a,b,sizeof(a))
#define Abs(a) (a ^ (a >> 31)) - (a >> 31)
#define random(a,b) (rand()%(b+1-a)+a)
#define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) int T;
int n, q, k;
int tmp, x, y, z; struct Data {
int num[];
void insert(int t) {
for (int i = ; i >= ; i--) {
if (t >> i & ) {
if (!num[i]) { num[i] = t; break; }
t ^= num[i];
}
}
}
}tree[M << ], ans; IN void Updata(int L, int R, int k,int pos) {
tree[k].insert(tmp);
if (L == R)return;
int mid = L + R >> ;
if (pos <= mid)Updata(lson, pos);
else Updata(rson, pos);
} IN void Query(int L, int R, int k) {
if(x<=L && R<=y){
for (int i = ; i >= ; i--) {
if (tree[k].num[i])ans.insert(tree[k].num[i]);
}
return;
}
int mid = L + R >> ;
if (x <= mid)Query(lson);
if (y > mid)Query(rson);
} IN int read() {//快读
int v = , f = ; char ch = getchar();
W(!isdigit(ch)) { f |= ch == '-'; ch = getchar(); }
W(isdigit(ch)) { v = (v << ) + (v << ) + (ch ^ ); ch = getchar(); }
return f ? -v : v;
} int main() {
T = read();
W(T--) {
n = read(), q = read(), k = read();
for (int i = ; i <= n; i++) {
tmp = read();
tmp &= (~k);//关键的一步
Updata(, n, , i);
}
W(q--) {
ms(ans.num, );
x = read(), y = read();
Query(, n, );
z = k;
for (int i = ; i >= ; i--)z = max(z, z ^ ans.num[i]);
printf("%d\n", z);
}
}
return ;
}
【2017西安邀请赛:A】XOR(线段树+线性基)的更多相关文章
- 2019牛客多校第四场B xor——线段树&&线性基的交
题意 给你 $n$ 个集合,每个集合中包含一些整数.我们说一个集合表示一个整数当且仅当存在一个子集其异或和等于这个整数.现在你需要回答 $m$ 次询问 ($l, r, x$),是否 $l$ 到 $r$ ...
- 2019年牛客多校第四场 B题xor(线段树+线性基交)
题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...
- Comet OJ - Contest #3 D 可爱的菜菜子 线段树+线性基
题意 给你一个长度为 \(n\) 的整数序列 \(a_1, a_2, \ldots, a_n\),你需要实现以下两种操作,每个操作都可以用四个整数 \(opt\ l\ r\ v\) 来表示: \(op ...
- CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)
题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...
- bzoj 4568: [Scoi2016]幸运数字【树链剖分+线段树+线性基】
一眼做法,好处是好想好写坏处是常数大,容易被卡(bzoj loj 洛谷开O2 能AC,不开有90分-- 大概就是树剖之后维护线段树,在线段树的每个节点上上维护一个线性基,暴力\( 60^2 \)的合并 ...
- [BZOJ4184]shallot 线段树+线性基
链接 题意:给你每个数字出现的时间和消失的时间,求每个时刻最大异或和 题解 按照时间建立线段树,线段树每个节点开个vector存一下这个时间区间有哪些数,然后递归进入的时候加入线性基,开一个栈记录一下 ...
- P哥的桶(线段树+线性基)
https://www.luogu.org/problem/P4839 题目: 有两个操作 1 a b 在a的位置添加b数值 (注意一个位置可以有多个值) 2 a b : 在 a到b的范围任取任意 ...
- Comet OJ - Contest #3 D可爱的菜菜子(线段树+线性基的合并)
这题其实挺经典的,看到求异或最大,显然想到的是线性基,不过这怎么维护?当然区间有关的东西都可以上线段树,区间修改时记录每个点的修改量k,然后合并线性基时再加入线性基.因为线性基是求一组极大线性无关组, ...
- Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army [线段树+线性扫一遍]
传送门 D. R2D2 and Droid Army time limit per test 2 seconds memory limit per test 256 megabytes input s ...
随机推荐
- bzoj 1138: [POI2009]Baj 最短回文路
额,,貌似网上的题解都说超时之类的. 然而我这个辣鸡在做的时候不知道在想什么,连超时的都不会. 超时的大概是这样的,f[x][y]表示x到y的最短回文路,然后更新的话就是 f[x][y]更新到 f[a ...
- LOJ #10002. 喷水装置
题目 裸的贪心. 基本思想见图: Code: #include<iostream> #include<cstdio> #include<cstring> #incl ...
- vue打包部署(含2.0)
到这里vue的所有平时使用的知识点都写完了 先补充一下vue2.x的安装 ## 全局脚手架 npm install vue/cli -g ## 查看版本 vue --version ## 新建项目 v ...
- 云服务器:西部数码VS阿里云
公司因为业务的需要,申请了两个云服务器.一个是西部数码的,一个是阿里云香港的.其中西部数码的配置高一些,一年4500元左右:香港的则便宜些,一年2200左右.因为备案问题,主业务放在成都的西部数码服务 ...
- java开发之分页查询
工具类 package com.luer.comm.utils; import java.util.List; public class PageBean<T> { //已知数据 priv ...
- Jupyter Notebooks usage
Important note: You should always work on a duplicate of the course notebook. On the page you used t ...
- JAVA CookieUtil
package com.itheima.shop.utils; import java.io.UnsupportedEncodingException; import java.net.URLDeco ...
- Tips for traing DNN
1. 一般的机器学习方法不会在train好的模型上检查training data的结果,因为DNN在training data上都没有办法获得很好的正确率, 所以要先回头看一下要对模型做什么修改, ...
- LeetCode1217 玩筹码(贪心)
题目: 数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中. 你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以): 将第 i 个筹码向左或者右移动 2 个单位,代价为 ...
- 中兴将用“加减乘除”建立理想 5G 网络
6 月 28 日,MWC 2019 上海展期间,中兴通讯执行董事.总裁徐子阳发表演讲表示,面对 5G 建网大势,要看破大势,不破不立.为此中兴将用“加减乘除”建立理想 5G 网络. 何为“加减乘除 ...