G. (Zero XOR Subset)-less(线性基)】的更多相关文章

You are given an array a1,a2,…,an of integer numbers. Your task is to divide the array into the maximum number of segments in such a way that: each element is contained in exactly one segment; each segment contains at least one element; there doesn't…
传送门 既然每一次选择出来的都是一个子段,不难想到前缀和计算(然而我没有想到--) 设异或前缀和为\(x_i\),假设我们选出来的子段为\([1,i_1],(i_1,i_2],...,(i_{k-1},N]\),那么我们选择出来的子段的异或和为\(x_{i_1} , x_{i_2}\ xor\ x_{i_1},...,x_{i_{k-1}}\ xor\ x_N\). 又因为我们需要避免的是任意子段集合的异或和不为\(0\),那么将这些异或和互相异或对于这个命题是否成立不会产生影响.那么从第二项开…
题目链接:http://codeforces.com/contest/1101/problem/G 题目大意:给你n个数,然后让你把这n个数分成尽可能多的集合,要求,每个集合的值看做这个集合所有元素的异或值,并且任意个集合对应的值,再进行异或也不能为0,然后如果不存在合理的分法的时候,输出-1.否则,输出能分出的最大的集合个数. 具体思路:求出这n个数的线性基就完事了,对于-1的情况,就是这n个值得异或值是0,这个时候无论你怎么分都是不管用的,其他情况直接输出线性基就可以了. 线性基的定义: 对…
(Zero XOR Subset)-less 题意 :把n个数分成多个集合,要求 不能有集合为空,最终不能有非空子集合异或值为0,尽可能划分的多一些. 思路 :非法情况就只有 n个数异或 为0,其他的情况集合个数就是线性基的内元素的个数.(因为有 基 就可以保证不为0,并且不可以再增加元素) 基 类似 极大线性无关组 .已经是最大的了,不可以再多. #include<bits/stdc++.h> using namespace std; #define ll long long #define…
[WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部分是什么.最简单的情况就是走一条链,有时候我们会从这条链走出去,走一段路径之后走一个环,再沿这条路径回到原来的链上,这样一来答案就变成了原来的链异或找到的环.我们发现任意的环都可以用来更新答案,那么我们找到原图中所有的环丢进线性基里,再把所有一条\(1\)到\(n\)的链在线性基里查询最大异或和就行…
题目传送门 最大XOR和路径 格式难调,题面就不放了. 分析: 一道需要深刻理解线性基的题目. 好久没打过线性基的题了,一开始看到这题还是有点蒙逼的,想了几种方法全被否定了.还是看了大佬的题解才会做的. 首先我们能想到,在图中从$1$走到$n$有这么两种情况,一种是一条链直接走到$n$,另一种是先走链然后绕若干个环然后回到链上走到$n$.对于这道题显然我们是要考虑所有的环的(由异或的性质可知). 然后我们又可以发现,如果一条链和一个环中间有一条路径相连,那么我们从链上走到环上时会经过这条路径一次…
链接:https://ac.nowcoder.com/acm/contest/180/D 来源:牛客网 xor序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 输入描述: 第一行为一个整数n,表示元素个数 第二行一行包含n个整数,分别代表序列中的元素 第三行为一…
传送门 输入输出样例 输入样例#1: 5 7 1 2 2 1 3 2 2 4 1 2 5 1 4 5 3 5 3 4 4 3 2 输出样例#1: 6 说明 [样例说明] 根据异或的性质,将一个数异或两次便会消除影响 那么预处理所有环插入线性基中,之后随便(因为能够消除影响)找一条简单路径查询最大值即可 code: //By Menteur_Hxy #include<cstdio> #include<iostream> #include<cstring> #include…
题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传送门 代码实现如下 #include <set> #include <map> #include <deque> #include <queue> #include <stack> #include <cmath> #include &l…
题意 给你 $n$ 个集合,每个集合中包含一些整数.我们说一个集合表示一个整数当且仅当存在一个子集其异或和等于这个整数.现在你需要回答 $m$ 次询问 ($l, r, x$),是否 $l$ 到 $r$ 的每个集合都能表示 $x$. 分析 先求出每个集合的线性基,然后用线段树维护线性基的交,详见代码 #include<bits/stdc++.h> #define reg register using namespace std; typedef long long ll; ; + ; int n…
题解见:https://www.luogu.org/problemnew/solution/P4151 其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面 然后随便走一条从1~n的链 最后求最大异或和即可 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define LL long long LL…
有一个\(2^k\cdot 2^k\) 的全零矩阵 \(M\),给出 \(2^k\cdot 2^k\) 的 \(01\) 矩阵 \(F\),现在可以将 \(F\) 的左上角置于 \(M\) 的任一位置(超出部分就循环,\(2^k\) 的下一个就是 \(1\)),然后相应位置相异或.现在可以执行任意次以上操作:将 \(F\)放于某个位置,执行对应的异或操作.问最后不同的 \(M\)有多少个. Solution 很显然我们可以 \(F\) 放在每一个位置的异或结果都算出来,放在一起,变成一个集合,那…
前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇. 思路:首先分析题目 一.区间操作 —— 线段树 二.异或操作 —— 线性基 这个两个不难想,关键是下一步的技巧 “或”运算 就是两个数的二进制中,对应位 只要有1,那么就是该位结果就是 1,所以要想k“或”运算后的结果尽量大, 就需要异或出的数,各个位上的1尽量多. 线性基的操作,可以求出区间最大异或和,但是我们需要的结果是  “或”运算. 所以我们可以将 k 取反,然后把所有数在加入线性基之前,全部 “与”运算一遍,再加入线性基. 这…
题目传送门 题意:给出一幅无向图,求1到n的所有路径中最大异或和,一条边可以被重复经过. 思路: 参考了大佬的博客 #pragma GCC optimize (2) #pragma G++ optimize (2) #pragma comment(linker, "/STACK:102400000,102400000") #include<bits/stdc++.h> #include<cstdio> #include<vector> #define…
题目地址:CF1101G (Zero XOR Subset)-less 线性基基础题 预处理一个前缀异或和 \(s_i\) 这样题目就变成了:在 \(n\) 个 \(s_i\) 中尽量选择多的数使选择的数产生的任意子集的异或和不为 \(0\) ,其中必须要选 \(s_n\) 如果 \(s_n=0\) ,则无解,输出 \(-1\) 否则,贪心,能选尽量选 代码: #include <bits/stdc++.h> using namespace std; const int N = 200006;…
题目传送门 题意:给出一个序列,试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为0. 思路:先处理出前缀异或,这样选择更多的区间其实就相当于选择更多的前缀异或,并且这些前缀异或不能异或出0,这就变成了线性基的基础题了.贪心的放,能放就放.不能放就意味着线性基的add函数里面的val最后变成了0,也就是当前已经插入的线性基已经可以异或出正在插入的数了,所以不能放. (今天真巧,一连遇到两道线性基的题目) #inc…
题面 题面 题解 观察到题目中的 "内陆经济环" 不好处理,因此我们把它拆成 "内陆经济链". 对于1号节点,我们创建一个它的复制节点n + 1号节点,这个节点继承1号节点的所有边,可以发现,一个1到1的内陆经济环,和一个1到n + 1的内陆经济链是等价的,因此我们只需要考虑如何在一个变化的图上维护一个点到另一个点的最大xor和即可. 观察到删边只会删去后来加入的边,所以就很好处理了,我们用线段树分治(时间分治)来维护. 具体求从1到n + 1的最大xor和的方法参…
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最高位的1在第x位. [就是原集合的任意子集的异或和 与 线性基的任意子集的异或和 完全相等] 2.线性基的构造法: 对每个数p从高位到低位扫,扫到第x位为1时,若ax不存在,则ax=p并结束此数的扫描,否则令p=p xor ax. [高斯消元] 异或版高斯消元后的线性基会变成类似上面的样子(线性基是…
题目分析: 考虑到这是一个区间的异或问题,不妨求出前缀和,令$sum[i] = Xor_{j=1}^{i}a[j]$. 对于区间$[l,r]$的异或结果,等于$sum[r] \oplus sum[l-1]$.那么原问题等价于选尽量多的点$p_x$,使得这些点构成的$sum[p_x] \oplus sum[p_{x-1}]$的子集的异或非$0$.我们不断往前异或,可以把问题转化为选尽量多的$p_x$,使得$sum[p_x]$的子集的异或非$0$.这是因为这两者的线性基等价. 这样子这题就变成BZO…
[BZOJ2115]Xor(线性基) 题面 BZOJ Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大的XOR和(十进制结果),注意输出后加换行回车. Sample Input 5 7 1 2 2 1 3 2 2 4 1 2 5 1 4 5 3 5 3 4 4 3 2…
G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组(u,v,s)表示u到v的(不一定为简单路径)路径上xor值为s.求出这张无向图所有不重复三元组的s之和.1≤n≤10^5,1≤m≤2*10^5. 想法: 如果做过[Wc2011 xor]这道题目(题解),那么问题变得简单起来了. ①假设我们钦定一个(u,v),设任意一条u->v的路径xor值为X,…
一.题目 [Wc2011] Xor 二.分析 比较有意思的一题,这里也学到一个结论:$1$到$N$的任意一条路径异或和,可以是一个任意一条$1$到$N$的异或和与图中一些环的异或和组合得到.因为一个数异或自己等于$0$. 对于这题,需要把所有的简单环先全部求出来,可以用$DFS$,然后用任意一条$1$到$N$的路径和的值与所有简单环的异或的值一起构造线性基(如果有不在路径上的环也没关系,可以走到这个环的位置再回来,相当于到这个环起点的这条路径走了两次,异或一下就抵消了),然后就是求最大值了. 三…
#include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) {return x>y?x:y;} ];}Tree[Maxn*Len]; void Insert(int x) { ; bool k; ;i--) { k=x&(<<i); ) Tree[Now].next[k]=++cnt; Now=Tree[Now].next[k]; } } i…
2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status][Discuss] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大…
4269: 再见Xor Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 131  Solved: 81[Submit][Status][Discuss] Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. Output 一行,包含两个数,最大值和次大值. Sample Input 3 3 5 6 Sa…
XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2302    Accepted Submission(s): 783 Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base number A…
4269: 再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 我太愚蠢了连数组开小了以及$2^{31}$爆$int$都不造   线性基裸题啊.... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #in…
Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair…
https://codeforces.com/contest/1101/problem/G 题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基的定义(线性无关),任意线性基组成的集合的异或和都不会等于0,因为假如等于零,说明一定存在一个基能被其他基异或表示 依次将数组a插入线性基中,最后非0线性基的数量就是答案 代码 #include<bits/stdc++.h> #define ll long long #define M 20000…
题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Solution\) 来找一些性质.从一个点出发,到达任意一个点后原路返回,那么得到的和仍为0.但是如果走完一个环后原路返回,则会得到这个环的Xor和. 那么从1点就可以得到任何一个环的Xor和.我们还需要一条1->n的路径,使得搭配上某些环后答案最大.于是我们就可以对环的权值构造线性基,拿路径Xor和在上面求最大…