线性基 刷题记录

HDU3949 XOR

  • 线性基板子题
  • 给定一些数
  • 求这些数能通过异或得到的第k大的值。
  • 代码:

     1 #include <bits/stdc++.h>
     2 #define nmax 10010
     3
     4 using namespace std;
     5 typedef long long ll;
     6 ll a[nmax],b[70],k[70]; //k[i] 第i小的数
     7 int n,q;
     8
     9 int main(){
    10     //freopen("owo.in","r",stdin);
    11     int T;
    12     cin>>T;
    13     for (int cas=1; cas<=T; cas++) {
    14         memset(b,0,sizeof(b));
    15         memset(k,0,sizeof(k));
    16         printf("Case #%d:\n",cas);
    17         scanf("%d",&n);
    18         for (int i=0; i<n; i++) {
    19             scanf("%lld",&a[i]);
    20             //求线性基
    21             for (int j=61; j>=0; j--) {
    22                 if(a[i]&(1LL<<j)){
    23                     if(b[j]) a[i]^=b[j];
    24                     else { b[j]=a[i]; break; }
    25                 }
    26             }
    27         }
    28         //往上回代,顺便统计个数
    29         int cnt=0;
    30         for (int i=0; i<=61; i++) if(b[i]) {
    31                 k[cnt]=b[i];
    32                 cnt++;
    33                 for (int j=i+1; j<=61; j++) if(b[j]&(1LL<<i)) b[j]^=b[i];
    34         }
    35         ll mmax=(1LL<<cnt)-1;
    36         scanf("%d",&q);
    37         ll inq;
    38         bool flag=false;
    39         if(cnt<n) flag=true;
    40         for (int j=0; j<q; j++) {
    41             scanf("%lld",&inq);
    42             if(flag) inq--;
    43             if(inq>mmax) cout<<-1<<endl;
    44             else {
    45                 ll ans=0;
    46                 for (int i=0; (1LL<<i)<=inq; i++) if((1LL<<i)&inq) ans^=k[i];
    47                 printf("%lld\n",ans);
    48             }
    49         }
    50     }
    51     return 0;
    52 }

    quq

BZOJ 2115: [Wc2011] Xor

  • 题意,一个无向图,节点编号1~n,求从1到n的一条路径,边和点可以经过多次,求经过边的权值xor最大的那一条路径
  • 题解:随便找一条路径从1~n的,然后可以发现任意路径都可以表示为在这条路径上走环,所以找出所有的环
  • 然后就是在所有的环里找和主路径异或最大的
  • 找所有的环用dfs
  • 代码:

     1 #include <bits/stdc++.h>
     2 #define nmax 50010
     3 #define mmax 100010
     4
     5 using namespace std;
     6 typedef long long ll;
     7 int head[nmax]={0},d[nmax]={0};  //被vis到的顺序
     8 ll a[nmax+mmax],tmp[nmax],b[70]={0};
     9 int n,m,idx=0,idxa=0;  //idza是记录环的数量
    10 struct edge{
    11     int v,ne;
    12     ll w;
    13 }e[mmax*2];
    14
    15 inline void addedge(int u,int v,ll w){
    16     idx++;
    17     e[idx].v=v;
    18     e[idx].w=w;
    19     e[idx].ne=head[u];
    20     head[u]=idx;
    21 }
    22
    23 void build(){
    24     cin>>n>>m;
    25     int a,b;   ll c;
    26     for (int i=0; i<m; i++) {
    27         scanf("%d%d%lld",&a,&b,&c);
    28         addedge(a,b,c);
    29         addedge(b,a,c);
    30     }
    31 }
    32
    33 void dfs(int u,int cnt){
    34     d[u]=cnt;
    35     for (int i=head[u]; i; i=e[i].ne){
    36         int v=e[i].v;  ll w=e[i].w;
    37         if(d[v]>d[u]) continue;
    38         if(d[v]){
    39             ll x=tmp[v]^tmp[u]^w;  //这个环的xor值
    40             //cout<<"now u= "<<u<<" v= "<<v<<"  and x= "<<x<<endl;
    41             if(x) a[++idxa]=x;  //如果是0就舍弃
    42         }else {
    43             tmp[v]=tmp[u]^w;  //在dfs(u)之前,u的tmp值已经算出
    44             dfs(v,cnt+1);
    45         }
    46     }
    47 }
    48
    49 void xxj(){
    50     for (int i=1; i<=idxa; i++) for (int j=63; j>=0; j--) if((1LL<<j)&a[i]){
    51         if(b[j]) a[i]^=b[j];
    52         else { b[j]=a[i]; break; }
    53     }
    54     ll ans=tmp[n];
    55     for (int i=63; i>=0; i--) ans=max(ans,ans^b[i]);
    56     printf("%lld\n",ans);
    57 }
    58
    59 int main(){
    60     build();
    61     dfs(1,1);
    62     xxj();
    63     return 0;
    64 }

    owo

原文地址:https://www.cnblogs.com/jiecaoer/p/11441062.html

时间: 2024-11-12 13:26:03

线性基 刷题记录的相关文章

BZOJ 刷题记录 PART 4

[BZOJ1143]CTSC的题目...先用floyed传递闭包,然后直接上匈牙利算法. [BZOJ1452]从未写过的二维树状数组.好像很简单.. struct two_bit { int f[305][305]; inline void add(int x,int z,int A) { for (;x<=n;x+=L(x)) for (int y=z;y<=m;y+=L(y)) f[x][y]+=A; } inline int ask(int x,int z) { int ans=0; f

[2015.6.28] OI刷题记录

FZSZOJ刷题记录: 1051 砝码称重: DP 多重背包 1058 liqeuer: 序列DP 1061 挖地雷:DP,注意需要倒过来做DP,同时记录路径. 1059 Number:DP 1054 数塔问题:同数字三角形,普通DP 1390 等式问题:爆搜,枚举每个+号或-号的位置 1006 中位数:维护大根堆+小根堆,每次插入调整 1005 Cube Stacking:并查集维护当前在第几个和当前集合的高度,并查集变种. 1073 DNA分子的最佳比对:序列DP 1110 奖学金:傻逼题,

首师大附中科创教育平台 我的刷题记录(3)

首师大附中科创教育平台我的刷题记录(给大家刷11--15题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> #include<math.h> using namespace std; int main() { int x,y; cin>>x; y=abs(x+2); cout<<x*x-y+5<<endl; return 0; } 绝对值函数 #include

BZOJ 刷题记录 PART 5

拖了好久才写的. [BZOJ2821]接触分块大法.这道题略有点新颖.首先我们先分块,然后统计每块中每个数出现的个数. 下面是联立各个方块,预处理出第I个方块到第J个方块出现正偶数次数的个数. for (i=1;i<=s;i++) { for (j=i;j<=s;j++) { sum[i][j]=sum[i][j-1]; for (k=a[j].l;k<=a[j].r;k++) { temp[data[k]]++; if (!(temp[data[k]]&1)) sum[i][j

首师大附中科创教育平台 我的刷题记录(7)

首师大附中科创教育平台我的刷题记录(这次给大家刷多一点,31--40题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> using namespace std; int main() { int n; cin>>n; if(n%4==0&&n%100!=0||n%400==0) cout<<"yes"<<endl; else cout&

首师大附中科创教育平台 我的刷题记录(6)

首师大附中科创教育平台我的刷题记录(给大家刷26--30题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> #include<math.h> using namespace std; int main() { double I,R,r,E; cin>>I>>R>>r; E=I*(R+r); cout<<E<<endl; return 0

首师大附中科创教育平台 我的刷题记录 0284 最强大脑

从现在开始,我的刷题记录都开始给大家一个一个刷!今天给大家献上“E”级题:最强大脑!! 试题编号:0284     最强大脑 难度级别:E: 运行时间限制:3000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 zhb国是一个传说中的国度,国家的居民叫做最强(chang)大脑(diao).Zhb国是一个N×M的矩形方阵,每个格子代表一个街区.然而zhb国是没有交通工具的.居民大脑(diao)们完全靠地面的弹射装置来移动.每个街区都装有弹射装置.使用弹射装置是需

首师大附中科创教育平台 我的刷题记录(5)

首师大附中科创教育平台我的刷题记录(给大家刷21--25题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> #include<math.h> using namespace std; int main() { double a,b,x; cin>>a>>b; x=-b/a; cout<<x<<endl; return 0; } 一元一次方程 #in

BZOJ 刷题记录 PART 1

作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/27109035 一.实体完整性定义 [例1]将Student表中的Sno属性定义为码. CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/ Sname CHAR(20) NOT NULL, Sage SMALLINT ); 或者: CREATE TABLE Student ( Sno CHAR(10