传送门

•参考资料

  [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. Pyhton AES_cbc解密

    最近很多朋友问我加密解密有没有啥好推荐的方式,一般对AES的加密解密方式直接用在线加密或者解密就行,我为了方便测试,将网址以python脚本的形式写了出来,很简单的东西,2分钟搞定,随手记录一下~~ ...

  2. ie8或9下ajax跨域问题

    ie8或9下ajax跨域支持,添加如下代码 <!--[if (IE 8)|(IE 9)]><script src="https://cdn.bootcss.com/jque ...

  3. ES6 中字符串的扩展

    1. 字符的Unicode表示法 JavaScript允许采用 \uxxxx 形式表示一个字符,其中 xxxx 表示字符的 Unicode 码点. "\u0061" // 表示小写 ...

  4. ajax请求 400 Bad Request, 然后就没进后台方法!

    原因可能是 ajax提交表单的data中实体的字段没有值(表单中无值填充的问题) 导致前台就已经报错了! 需要注意的字段类型 double  date  int .. 我就是因为这个double  , ...

  5. oracle Transactional

    从shutdown transactional命令发布起, 禁止建立任何新的oracle连接. 从shutdown transactional命令发布起,禁止启动任何新的事务. 一旦数据库上所有的活动 ...

  6. QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法

    前言 在阿里七层流量入口接入层(Application Gateway)场景下, Nginx 官方的Smooth Weighted Round-Robin( SWRR )负载均衡算法已经无法再完美施展 ...

  7. Spark in action on Kubernetes - Spark Operator的原理解析

    前言 在上篇文章中,向大家介绍了如何使用Spark Operator在kubernetes集群上面提交一个计算作业.今天我们会继续使用上篇文章中搭建的Playground进行调试与解析,帮助大家更深入 ...

  8. 错误信息:FATAL: No bootable medium found! System halted.

    一.解决方法 先上1张图,显示的错误信息 再上2张图,幸好在之前安装了XP系统,不然还真不好解决.从图中可以看出WIN-XP和Linux系统安装好之后的差异,Linux的的存储信息上显示“第二通道没有 ...

  9. Otracle数据库定时任务--dbms_job

    一.dbms_job涉及到的知识点 1.创建job: variable jobno number; dbms_job.submit(:jobno, --job号 'your_procedure;'-- ...

  10. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...