传送门

•参考资料

  [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. replace all

    OPTION COPY OUTREC FINDREP=(INOUT=(X'0E',X'400E', X'0F',X'0F40'))

  2. 移动端的vh 和 vw简介和使用场景

    vw 相对于视窗的宽度:视窗宽度是100vw:vh则类似,是相对于视窗的高度,视窗高度是100vh. 这里的视窗指的又是啥? 是浏览器内部宽度大小(window.innerWidth)? 是整个浏览器 ...

  3. Elasticsearch 启动需要密码?

    vagrant@homestead:~$ systemctl disable elasticsearch.service Synchronizing state of elasticsearch.se ...

  4. CSS基础学习中的几大要点心得

    CSS是前端学习中较为简单但又非常复杂的课程,说简单是因为学习它并不需要太多推理论证和逻辑思维,说它非常复杂则是更多的侧重在它的“杂”上,因为太多的格式和套路需要我们注意.以下谨列出本人在CSS学习中 ...

  5. mysqldump命令之数据库迁移

    格式说明如下: mysqldump -h源主机IP -u源主机用户 -p源主机用户密码 数据库名 | mysql -h目标主机IP -u目标主机用户 -p目标用户密码 数据库名 

  6. thinkphp php审核后返回信息给html

    1.die("<script>alert('至少选择一个收款方式!');history.back(-1);</script>");

  7. markdown-it + highlight.js简易实现

    markdown-it 官方demo markdown-it 文档 1.配置highlightjs,针对markdown中各种语言高亮,针对对应的标签 pre code 里面的样式 -- index. ...

  8. 云原生应用 Kubernetes 监控与弹性实践

    前言 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过Cloud Provider.CRD C ...

  9. MUI - 为textarea添加语音输入和清除的功能

    为textarea添加语音输入和清除的功能 mui支持input输入框语音输入和清除的功能,只需要添加相关css类即可. http://www.cnblogs.com/phillyx/ 代码如下 &l ...

  10. selenium实现网页截全屏

    from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless' ...