欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > CCPC赛后补题-线性基

CCPC赛后补题-线性基

2024/10/25 10:22:43 来源:https://blog.csdn.net/m0_49303993/article/details/142151173  浏览:    关键词:CCPC赛后补题-线性基

模板题:https://www.luogu.com.cn/problem/P3812

线性基可以用一个长度为$ \log_2N $的数组描述值域[1,N]0的情况需要特判。

  • 一个长度为64的线性基可以描述所有的64位整数。

2024年CCPC网络赛中,考到了线性基。没学过,追悔莫及。

  • https://codeforces.com/gym/105336

在这里插入图片描述

原题需要在不污染高位的情况下,找到尽可能最优的二进制串修改低位,使得两个二进制串的最大值最小。

处理这种找最优串的问题,我能想到的只有字典树,而字典树在本题中非常乏力:会污染高位,必须要在O(1)的时间内找到最优串。

线性基模板的函数包括:

  • void ins(int x):向线性基数组中插入x
  • bool check(int x):判断x是否可以由线性基构造
  • int qmin():查询当前线性基可以构造的最小值
  • int qmax():查询当前线性基可以构造的最大值
  • void rebuild():重构线性基,使得每一位尽可能少地影响其它位
  • int kth(int k):查询线性基可以构造的第k小的数
  • int qrank(int x):查询x是线性基可以构造的第几小的数

全局变量包括:

  • const int MN=64:线性基数组的长度
  • int p[MN]:存储线性基
  • int d[MN]:存储有效势,也就是数组p[]中的非0
  • int cnt:线性基的维数、势、元素个数,同时为d[]的有效长度

线性基数组的第i in [0,MN-1]位,表示的是,最高位是第i位的01串。

  • 当想要构造一个第i位是1的串时,可以异或,线性基数组的第i位。

在插入和查询时,从高位向低位枚举,因为高位的势会影响低位,对低位造成的影响在枚举到低位时,由低位的势处理。

线性基板子

talk is cheap show me the code:

#define int long long
using namespace std;
const int MN=64;int p[MN],d[MN],cnt;void ins(int x) {for(int i=MN-1; i>=0; i--) {if(x>>i&1) {if(p[i])x^=p[i];else {p[i]=x;return;}}}
}
bool check(int x) {for(int i=MN-1; i>=0; i--) {if(x>>i&1) {if(p[i])x^=p[i];else return false;}}return true;
}int qmin() {for(int i=0; i<MN-1; i++) {if(p[i])return p[i];}return 0;
}int qmax() {int res=0;for(int i=MN-1; i>=0; i--) {res=max(res,res^p[i]);}return res;
}void rebuild() {cnt=0;for(int i=MN-1; i>=0; i--)for(int j=i-1; j>=0; j--)if(p[i]&1ll<<j)p[i]^=p[j];for(int i=0; i<MN; i++)if(p[i])d[cnt++]=p[i];
}int kth(int k) {if(k>=1ll<<cnt)return -1;int ans=0;for(int i=MN-1; i>=0; i--)if(k>>i&1)ans^=d[i];return ans;
}int qrank(int x) {int ans=0;for(int i=cnt-1; i>=0; i--) {if(x>=d[i]) {ans+=1<<i;x^=d[i];}}return ans;
}

AC代码

  • https://codeforces.com/gym/105336/submission/280725694

赛后补题,WA10😭:
在这里插入图片描述
WA的原因包括:

  • 插入线性基忘了return
  • 没关闭流同步超时
  • 用(a&1<<i)==1判1
  • 第一个无法抹掉的1有两种可能,需要封装函数

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com