【模板】线性基

ACM模板


文章目录

      • 构造线性基
      • 线性基模板操作
      • 线性基相关题目

学习线性基可考虑以下大佬博客
知乎Pecco博客
博客园Kaori博客
menci博客
肖然博客
从线性代数谈线性基(有点硬核)

构造线性基

普通插入:
不能保证除了主元上其他线性基元素该位置为1

typedef unsigned long long ull;
ull p[64];
void insert(ull x)
{for(int i=63;i>=0;i--){if(!(x>>i&1)) continue;if(!p[i]) {p[i]=x;break;}x^=p[i];}
}

进阶插入:

若p[i]!=0(即主元i存在),则线性基中只有p[i]的第i位是1;且此时p[i]的最高位就是第i位

bool insert(ll x)
{for(int i=62;i>=0;i--){if(!(x>>i&1)) continue;if(p[i]){x^=p[i];continue;}for(int j=i-1;j>=0;j--)if(x>>j&1) x^=p[j];for(int j=62;j>i;j--)if(p[j]>>i&1) p[j]^=x;p[i]=x;return 1;}return 0;
}

线性基模板操作

1.在一系列数中选若干数做异或,求最大值。

反向遍历p[]数组,按高位贪心(因为对于每个p[i]来说,当且仅当目前的res的第i位为0时,选这个数可以使res增大。而此时,选它一定比不选它更优)

普通插入代码:

ull getmax()
{ull res=0;for(int i=63;i>=0;i--)if((res^p[i])>res) res^=p[i];return res;
}

进阶插入:直接把所有p[i]异或即是最大值。

2.在一系列数中选若干数做异或,求最小值。

直接求线性基,然后选最小的一个即可。显然它与线性基中任意其他数异或后,都不会更小。
注意:特判0

普通插入代码:

ull getmin()
{if(cnt0) return 0;for(int i=0;i<=63;i++)if(p[i]) return p[i];
}

进阶插入:找到最小主元即可

3.查询某数是否能被表示出来

按照插入的思路进行检查即可。

bool belong(ull x)
{for(int i=63;i>=0;i--){if(!(x>>i&1)) continue;if(!p[i]) return false;x^=p[i];}return true;
}

4.查询第k小值

使用进阶插入解决此问题,把k进行二进制分解,把1对应位置的主元xor起来。
注意:第0小是0

ll now[64];
int cnt=0;
for(int i=0;i<=62;i++)if(p[i]) now[cnt++]=p[i];
ll query(ll k)
{if(flag) k--;if(!k) return 0;if(k>=(1ull<<cnt)) return -1;ll res=0;for(int i=0;i<cnt;i++)if(k>>i&1) res^=now[i];return res;
}

线性基相关题目

【模板】线性基
普通插入即可解决

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=70;
ull p[N];
int n;
void insert(ull x)
{for(int i=63;i>=0;i--){if(!(x>>i&1)) continue;if(!p[i]) {p[i]=x;break;}x^=p[i];}
}
int main()
{cin>>n;for(int i=1;i<=n;i++) {ull x;cin>>x;insert(x);}ull res=0;for(int i=63;i>=0;i--)if((res^p[i])>res) res^=p[i];//不难发现只有(res>>i&1)==0是才会满足if语句cout<<res<<'\n';return 0;
}

异或运算
第k异或小,使用进阶插入即可解决。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=10010;
ll p[70];
int n,q;
bool flag;
ll now[70];
int cnt;
bool insert(ll x)
{for(int i=62;i>=0;i--){if(!(x>>i&1)) continue;if(p[i]){x^=p[i];continue;}for(int j=i-1;j>=0;j--)if(x>>j&1) x^=p[j];for(int j=62;j>i;j--)if(p[j]>>i&1) p[j]^=x;p[i]=x;return 1;}return 0;
}
ll query(ll k)
{if(flag) k--;if(!k) return 0;if(k>=(1ull<<cnt)) return -1;ll res=0;for(int i=0;i<cnt;i++)if(k>>i&1) res^=now[i];return res;
}
int main()
{int T;cin>>T;for(int ca=1;ca<=T;ca++){printf("Case #%d:\n",ca);memset(p,0,sizeof p);flag=0;cnt=0;cin>>n;for(int i=1;i<=n;i++){ll x;cin>>x;if(!insert(x)) flag=1;}cin>>q;for(int i=0;i<=62;i++)if(p[i]) now[cnt++]=p[i];while(q--){ll k;cin>>k;cout<<query(k)<<'\n';}}return 0;
}

[BJWC2011]元素
按照magic逆序,然后线性基插入

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
const int N=1010;
ull p[N];
struct node
{ll id,w;bool operator<(const node& o) const {return w>o.w;}
}q[N];
int n;
bool insert(ull x)
{for(int i=63;i>=0;i--){if(!(x>>i&1)) continue;if(!p[i]) return p[i]=x,1;x^=p[i];}return 0;
}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>q[i].id>>q[i].w;sort(q+1,q+1+n);ll res=0;for(int i=1;i<=n;i++){if(insert(q[i].id)) res+=q[i].w;}cout<<res<<'\n';}return 0;}

Good subset
线性基+线段树题解
搜索题解
2020/09/30 要加油哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】8月27日题目精讲 Is It A Tree?

链接&#xff1a;https://ac.nowcoder.com/acm/problem/105905 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 10000K&#xff0c;其他语言20000K 64bit IO Format: %lld 题目描述 A tree is a well-known data struct…

YbtOJ#631-次短路径【左偏树,最短路】

正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/1 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;对于每个点iii求不经过i∼1i\sim 1i∼1的最短路的第一条边的情况下iii到111的最短路 数据保证这条边唯一 n∈[1,105],m∈[1,2105],c∈[1,103]n\in[1,10^…

好代码是管出来的——使用Jenkins搭建CI服务器

Jenkins是一个开源的跨平台的CI工具&#xff0c;它可以部署在Windows、Linux等平台上&#xff0c;并且Jenkins提供了非常丰富的插件来帮助完成编译、测试、部署等工作。  本文将介绍在Windows平台上使用Jenkins完成.Net Core应用的持续集成环境搭建&#xff0c;其主要内容有&…

牛客练习赛 59

A.小乔和小灰灰 前几天刚刚学了序列自动机&#xff0c;这题直接也没咋想暴力的做法&#xff0c;直接上序列自动机匹配子序列即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm&…

【图论】清理牛棚/Cleaning Shifts S(luogu 4644)

正题 luogu 4644 题目大意 给你一段时间&#xff0c;有n头奶牛&#xff0c;第i头可以花费sis_isi​的代价清理lil_ili​到rir_iri​&#xff0c;问你清理完所有时间段的最小代价 解题思路 所有点需求都为1的线性规划&#xff0c;直接代入最短路就可以了 code #include<q…

1153 Decode Registration Card of PAT (25分)

1153 Decode Registration Card of PAT (25分) 题意&#xff1a; 给出一组学生的准考证号和成绩 准考证号组成为&#xff1a;考试等级&#xff08;TAB&#xff09;&#xff0c;考场号&#xff08;从101到999&#xff09;&#xff0c;考试日期&#xff08;yymmdd&#xff09;&…

YbtOJ#893-带权的图【高斯消元,结论】

正题 题目链接:https://www.ybtoj.com.cn/problem/893 题目大意 给出一张nnn个点mmm条边的无向联通图&#xff0c;每条边正反向各有A,B,CA,B,CA,B,C三种边权。 保证满足 Ax,y−Ay,x,Bx,yBy,x,Cx,y−Cy,xA_{x,y}-A_{y,x}\ ,\ B_{x,y}B_{y,x}\ ,\ C_{x,y}-C_{y,x}Ax,y​−Ay,x​…

.Net Core 2.1 通用主机(Core 在控制台应用程序中的应用)

一、介绍官方文档中说&#xff0c;Microsoft.AspNetCore.App 元包&#xff08;ASP.NET Core 2.1 或更高版本&#xff09;包含通用主机的Microsoft.Extensions.Hosting包&#xff0c;当创建控制台项目以后并没有相应的包。在官方案例中所用的Nuget包有&#xff1a;1. Microsoft.…

【二分】【最小生成树】公路修建问题(P2323)

正题 P2323 题目大意 给你n个点和若干边&#xff0c;每条边有两种代价&#xff0c;问你选择n-1条边使得这n个点连通&#xff0c;且选择第一种代价的边不小于k&#xff0c;让你使代价最大值最小 解题思路 二分答案&#xff0c;然后最小生成树&#xff0c;连接可以连得边&…

PAT 1152 Google Recruitment (20 分)- 甲级

题意 给出一个L长的字符串&#xff0c;求出其中第一个k位长的素数 题解&#xff1a; 其实就是暴力求解&#xff0c;不过在这介绍一个函数 int numstoi(s); s是string型的&#xff0c;stoi可以将string转换成int型 string f_str std::to_string(f); 是将int型转化成string型…

Grakn Forces 2020——D题Pecco模型总结

今天是双节但是为什么我今天好自闭啊啊啊&#xff0c;自己在寝室自闭了一下午&#xff0c;好无聊。明天一定要精神满满啊&#xff01; A - Circle Coloring 签到题 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iost…

产品开发管理之流程和体系(总篇)

前言秋风瑟瑟&#xff0c;夏日的灼热犹在&#xff0c;就瞬间迎来刺骨寒风。凛冬将至&#xff0c;今天对我们来说&#xff0c;像贴面的利刃一样冰冷而真实。农民、建筑工人、司机、程序员、私企高管、私企老板、资本巨富&#xff0c;都被裹挟进了这个焦灼的时代&#xff0c;没有…

YbtOJ#593-木棍问题【费用流】

正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/3 题目大意 n∗mn*mn∗m的网格上有一些格子有木球&#xff0c;两个相邻木球直接可以有木棍。 两个LLL形的木棍会产生AAA的代价&#xff0c;两个III形的木棍会产生BBB的代价 对于每个kkk求出插入kkk根木棍时的最小…

【LCT】旅游(P1505)

正题 P1505 题目大意 给你一棵树让你进行以下操作 1.修改一条边的权值 2.把一条链的权值取反 3.查询一条链的权值和 4.查询一条链的边权最大值 5.查询一条链的边权最小值 解题思路 把边拆成点&#xff0c;然后就是lct模板了 code #include<cstdio> #include<…

1143 Lowest Common Ancestor 甲级

题意&#xff1a; 给出一棵二叉搜索树的前序遍历&#xff0c;问结点u和v的共同最低祖先是谁&#xff0c;利用先序遍历特点。 二叉搜索树满足&#xff1a; 节点的左子树只包含键小于节点键的节点。 节点的键只包含节点的右键大于或等于子树的节点的键。 左子树和右子树也必须是…

牛客练习赛 70

A - 重新排列 二分答案&#xff0c;然后循环一边即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; const int N100010; int cnt[30]; char s[N]; ch…

《.NET Core 2.0 应用程序高级调试》7折优惠

活动截止到2018年10月15日晚24:00&#xff0c;之后恢复8.6折价格。都说.NET Core 在Linux 上跑得快&#xff0c;可是如果.NET Core 程序在Linux 操作系统上出现了内存泄漏、死锁或者崩溃情况怎么办&#xff1f;怎样在Linux 和macOS操作系统上有效地使用工具对.NET Core 应用程序…

CF803G-Periodic RMQ Problem【离散化,线段树,ST表】

正题 题目链接:https://www.luogu.com.cn/problem/CF803G 题目大意 一个长度为nnn的序列aaa复制kkk份连接&#xff0c;要求支持 区间赋值区间查询最小值 n,q∈[1,105],k∈[1,104]n,q\in[1,10^5],k\in[1,10^4]n,q∈[1,105],k∈[1,104] 解题思路 先把所有查询的连续区间边界离…

【bfs】Replication G(P7151)

正题 P7151 题目大意 给你一个n*n的方阵&#xff0c;有若干机器人的起始点 机器人在每个时间会向一个方向走一步&#xff0c;经过D个时间后就会在相邻四个格子复制一个副本&#xff0c;副本会和原机器人走相同方向&#xff0c;同时也会复制 当任意一个机器人的操作碰到障碍…

1151 LCA in a Binary Tree 甲级

题意&#xff1a; 给定前序遍历和中序遍历&#xff0c;问u和v的lca &#xff08;先是中序&#xff0c;后是中序&#xff09; 题解&#xff1a; 方法一&#xff1a; 参考题解 将树映射到一颗BST上&#xff0c;在BST上找到答案然后再映射回原本的树 方法二&#xff1a; 参考题…