传送门

•参考资料

  [1]:在线线性基

  [2]:离线线性基

  [3]:离线线性基

•题意

  给你 n 个数,m 次询问;

  每次询问给定一个区间 $l,r$,求 $a_{l \cdots r}$ 异或的最大值;

•线段树+线性基

  参考了一下资料[1],学会了如何将线性基和线段树结合;

  虽然在此题中会 TLE,但是却学到了不少东西;

  首先,在建树的时候,将叶节点上的值插入到线性基中;

  在回溯的时候,通过 Merge 操作,将 pos 的儿子节点的线性基合并到 pos 的线性基上;

  类似于常规线段树中的 pushUp 操作;

  此算法可以用来做这道题:洛谷P4839

•Code(线段树TLE版本)

 #include<bits/stdc++.h>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
const int maxn=5e5+; int n,q;
int a[maxn];
struct Seg
{
int l,r;
int a[];
int mid(){return l+((r-l)>>);}
void Insert(int x)
{
for(int i=;i >= ;--i)
{
if(x&(<<i))
{
if(!a[i])
{
a[i]=x;
return ;
}
x ^= a[i];
}
}
}
int Max()
{
int ans=;
for(int i=;i >= ;--i)
ans=max(ans,ans^a[i]);
return ans;
}
}seg[maxn<<]; Seg Marge(Seg a,Seg b)
{
Seg tmp=b;
for(int i=;i <= ;++i)
if(a.a[i])
tmp.Insert(a.a[i]);
return tmp;
}
void buildSeg(int l,int r,int pos)
{
seg[pos].l=l;
seg[pos].r=r; if(l == r)
{
seg[pos].Insert(a[l]);
return ;
} int mid=l+((r-l)>>);
buildSeg(l,mid,ls(pos));
buildSeg(mid+,r,rs(pos)); seg[pos]=Marge(seg[ls(pos)],seg[rs(pos)]);
seg[pos].l=l;///此处要注意,因为Marge返回的结果未给l,r赋值
seg[pos].r=r;
}
Seg Query(int l,int r,int pos)
{
if(seg[pos].l == l && seg[pos].r == r)
return seg[pos]; int mid=seg[pos].mid(); if(r <= mid)
return Query(l,r,ls(pos));
else if(l > mid)
return Query(l,r,rs(pos));
else
return Marge(Query(l,mid,ls(pos)),Query(mid+,r,rs(pos)));
}
void Solve()
{
for(int i=;i <= q;++i)
{
int l,r;
scanf("%d%d",&l,&r); Seg ans=Query(l,r,); printf("%d\n",ans.Max());
}
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",a+i);
buildSeg(,n,); scanf("%d",&q);
Solve(); return ;
}

•离线线性基

  学会了和线段树结合后,看了看正解 线性基+贪心,果然,看不懂;

  放弃了这个解法,找了几篇离线线性基的做法(资料[2],[3]);

  大致做法是,将所有询问收集起来,并按照 r 升序排列;

  边插入 ai 边判断当前的 i 是否为当前询问的右端点;

  插入的时候,记录两个数值 base[ i ] , p[ i ],表示第 p[ i ] 个数 $a_{p_i}$ 在通过 Insert() 操作时,插入的时候插到了 base[ i ] 中;

  每次插入第 i 个数 ai 时,优先让高位的 1 用当前的位置来表示,这样可以保证高位的 1 对应的 base 值可以对最大值有贡献;

•Code(离线)

 #include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+; int n,m;
int a[maxn];
struct Query
{
int l,r;
int pos;
bool operator < (const Query &obj) const
{
return r < obj.r;
}
}q[maxn];
int base[];
int p[];
int ans[maxn]; void Insert(int pos,int x)
{
for(int i=;i >= ;--i)
{
if(x&(<<i))
{
if(!base[i])
{
base[i]=x;
p[i]=pos;
return ;
}
else if(pos > p[i])///第i位的base[i]优先让p大的表示
{
swap(base[i],x);
swap(p[i],pos);
}
x ^= base[i];
}
}
}
int Max(int k)
{
int l=q[k].l;
int r=q[k].r; int ans=;
///查询时,保证p大的高位base优先考虑
for(int i=;i >= ;--i)
if(p[i] >= l && p[i] <= r)
ans=max(ans,ans^base[i]);
return ans;
}
void Solve()
{
sort(q+,q+m+); int k=;
for(int i=;i <= n;++i)
{
Insert(i,a[i]); while(i == q[k].r)
{ ans[q[k].pos]=Max(k);
k++;
}
} for(int i=;i <= m;++i)
printf("%d\n",ans[i]); return ;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",a+i); scanf("%d",&m);
for(int i=;i <= m;++i)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].pos=i;
} Solve(); return ;
}

•在线线性基

  学会了离线的,再看资料[1]的正解代码时,理解起来容易了不少;

•Code(在线)

 #include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+; int n,q;
int a[maxn];
int base[maxn][];
int p[maxn][]; void Insert(int pos,int x,int k)
{
for(int i=;i >= ;--i)
{
if(x&(<<i))
{
if(!base[k][i])
{
base[k][i]=x;
p[k][i]=pos;
}
else if(pos > p[k][i])
{
swap(pos,p[k][i]);
swap(x,base[k][i]);
}
x ^= base[k][i];
}
}
}
int Max(int l,int r)
{
int ans=;
for(int i=;i >= ;--i)
if(p[r][i] >= l)
ans=max(ans,ans^base[r][i]);
return ans;
}
void Solve()
{
for(int i=;i <= n;++i)
{
memcpy(base[i],base[i-],sizeof(base[i-]));
memcpy(p[i],p[i-],sizeof(p[i-])); Insert(i,a[i],i);
} while(q--)
{
int l,r;
scanf("%d%d",&l,&r); printf("%d\n",Max(l,r));
}
}
int main()
{
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",a+i);
scanf("%d",&q); Solve(); return ;
}

Codeforces 1100F(离线 or 在线)的更多相关文章

  1. CodeForces 1100F Ivan and Burgers

    CodeForces题面 Time limit 3000 ms Memory limit 262144 kB Source Codeforces Round #532 (Div. 2) Tags da ...

  2. CodeForces - 1100F:Ivan and Burgers (线性基&贪心)(离线 在线)

    题意:给定N个数,Q次询问,求区间最大异或和. 思路:一开始想的线性基+线段树.单次线性基合并的复杂度为20*20,结合线段树,复杂度为O(NlogN*20*20):显然,超时. 超时代码: #inc ...

  3. codeforces 1100F Ivan and Burgers 线性基 离线

    题目传送门 题意: 给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值. 思路:离线加线性基. 线性基学习博客1 线性基 ...

  4. CDH集成Kafka,两种方式:离线、在线

    1.离线 先下载相应版本的kafka http://archive.cloudera.com/kafka/parcels/ 然后放置相应目录,如下图: 然后直接添加组件即可 2.在线 配置相应的kaf ...

  5. HDU 2874 Connections between cities(LCA(离线、在线)求树上距离+森林)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题目大意:给出n个点,m条边,q个询问,每次询问(u,v)的最短距离,若(u,v)不连通即不在同 ...

  6. SPOJ 10628 Count on a tree(Tarjan离线 | RMQ-ST在线求LCA+主席树求树上第K小)

    COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to  ...

  7. Linux配置yum源(离线和在线)

    配置yum源有2种方法,一种是离线yum源,另外一种是在线yum源. 一.离线yum源,基于安装光盘提供的安装仓库. 建立一个属于仓库文件夹 mkdir /media/zidong cd /media ...

  8. centos7 离线升级/在线升级操作系统内核

    目录 一.前言 二.系统环境 三.系统内核下载网址 四.centos7离线升级系统内核 1.先查看系统环境 2.离线升级系统内核 五.在线升级系统内核 一.前言 CentOS(Community EN ...

  9. Codeforces 1100F(线性基+贪心)

    题目链接 题意 给定序列,$q(1\leq q \leq 100000) $次询问,每次查询给定区间内的最大异或子集. 思路 涉及到最大异或子集肯定从线性基角度入手.将询问按右端点排序后离线处理询问, ...

随机推荐

  1. 页面滚动事件和利用JS实现回到顶部效果

    页面滚动 事件:window.onscroll, 获得页面滚动位置:document.body.scrollTop: HTML代码: 这里注意此处逻辑,大于500就显示,否则就隐藏,还有注意如果变量名 ...

  2. sas教程

    http://web5.pku.edu.cn/pucssr/SASbiancheng.pdf 本教程中的主题将向您介绍 SAS Enterprise Guide.您最好依次浏览这些主题. 概述 启动项 ...

  3. 【JZOJ4792】【NOIP2016提高A组模拟9.21】整除

    题目描述 麦克雷有一个1~n的排列,他想知道对于一些区间,有多少对区间内的数(x,y),满足x能被y整除. 输入 第一行包含2个正整数n,m.表示有n个数,m个询问. 接下来一行包含n个正整数,表示麦 ...

  4. 遗传算法MATLAB实现(1):工具箱下载及安装

    到官网下载谢菲尔德大学的GA工具箱:http://codem.group.shef.ac.uk/index.php/ga-toolbox(其实蛮不懂为什么有人把这个传到某个网上还需要积分才能下载,人家 ...

  5. JS对HTML实体字符转义和反转义

    一.名词解释 HTML实体字符: 由于在HTML中有些符号是预留的,比如在html中不能直接使用尖括号(‘<’或‘>’),会被误认为标签符号.所以需要通过HTML实体字符去进行替换: HT ...

  6. JMeter与LoadRunner的对比

    1. 界面.安装.协议支持.函数库.成本.开源 2. 都可以实现分布式负载,相对来说LoadRunner更强大一些 3. 都支持在windows和linux环境的负载生成器.控制台方面,Jmeter跨 ...

  7. 16.libgdx根据配置文件生成布局(未完)

    思路: screen分为普通和复杂两种,普通的功能大部分是页面跳转以及简单的crud数据,复杂的单独弄出来 跳转普通的screen,直接根据配置文件调整设置 <layouts> <l ...

  8. CTR+A组合键 以及终止按键事件传递

    Key UP 或Down 事件中 实现CTR+A全选 if ( Control.ModifierKeys==Keys.Control && e.KeyCode == Keys.A)   ...

  9. 2018-9-19-Roslyn-通过-Nuget-管理公司配置

    title author date CreateTime categories Roslyn 通过 Nuget 管理公司配置 lindexi 2018-9-19 10:57:5 +0800 2018- ...

  10. @codeforces - 702F@ T-Shirts

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 n 件 T-shirt,第 i 件 T-shirt 有一个 ...