题意:给定n个数,每个数为c[i],有q个询问,每次询问从第l个到第r个数字的最大xor和

n,q<=5e5,c[i]<=1e6,时限3s

思路:直接线段树维护区间线性基是3个log,会T

做法1:因为不是强制在线把询问分治能降到2个log

 #include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<bitset>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef set<int>::iterator iter;
#define fi first
#define se second
#define MP make_pair
#define mem0(a) memset(a,0,sizeof(a))
#define N 510000
#define M 15
#define MOD 1000000007
#define eps 1e-10
#define pi acos(-1)
#define oo 1e9
 
int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
}
 
struct base
{
//ll d[20],p[20];
int d[];
int cnt; base()
{
memset(d,,sizeof(d));
//memset(p,0,sizeof(p));
cnt=;
}
bool insert(int val)
{
if(val==) return ;
for(int i=;i>=;i--)
if((val>>i)&)
{
if(!d[i])
{
d[i]=val;
break;
}
val^=d[i];
}
return val>;
}
int query_max()
{
int ret=;
for(int i=;i>=;i--) ret=max(ret,ret^d[i]);
return ret;
}
int query_min()
{
for(int i=;i<=;i++)
if(d[i]) return d[i];
return ;
}
/*void rebuild()
{
for(int i=20;i>=0;i--)
for(int j=i-1;j>=0;j--)
if((d[i]>>j)&1) d[i]^=d[j];
for(int i=0;i<=20;i++)
if(d[i]) p[cnt++]=d[i];
}
ll kthquery(ll k)
{
int ret=0;
if(k>=(1LL<<cnt)) return -1;
for(int i=20;i>=0;i--)
if((k>>i)&1) ret^=p[i];
return ret;
}*/ base operator+(const base&_A)const
{
base ret=*this;
for(int i=;i>=;i--)
if(_A.d[i]) ret.insert(_A.d[i]);
return ret;
}
}t[N],b;
 
struct arr
{
int x,y,id;
}q[N],c[N];
 
int a[N],ans[N]; /*base merge(const base &n1,const base &n2)
{
base ret=n1;
for(int i=20;i>=0;i--)
if(n2.d[i]) ret.insert(n1.d[i]);
return ret;
}*/
 
void solve(int l,int r,int x,int y)
{
if(l==r)
{
for(int i=x;i<=y;i++) ans[q[i].id]=a[l];
return;
}
if(x>y) return;
int mid=(l+r)>>;
memset(b.d,,sizeof(b.d));
for(int i=mid;i>=l;i--)
{
b.insert(a[i]);
for(int j=;j<=;j++) t[i].d[j]=b.d[j];
}
memset(b.d,,sizeof(b.d));
for(int i=mid+;i<=r;i++)
{
b.insert(a[i]);
for(int j=;j<=;j++) t[i].d[j]=b.d[j];
}
int l1=x,r1=y;
for(int i=x;i<=y;i++)
{
if(q[i].y<=mid) c[l1++]=q[i];
else if(q[i].x>mid) c[r1--]=q[i];
else
{
base tmp=t[q[i].x]+t[q[i].y];
ans[q[i].id]=tmp.query_max();
}
}
for(int i=x;i<l1;i++) q[i]=c[i];
for(int i=r1+;i<=y;i++) q[i]=c[i];
solve(l,mid,x,l1-);
solve(mid+,r,r1+,y);
}
 
int main()
{
//freopen("cf1100f.in","r",stdin);
//freopen("cf1100f.out","w",stdout);
int n,m;
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].x,&q[i].y);
q[i].id=i;
}
solve(,n,,m);
for(int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}

做法2:假设固定右端点,维护log个维上使生成空间变大的最大的l

比做法1快3倍

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,int>P;
#define N 510000
#define M 151000
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1
 
const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
ll INF=1e18;
ll inf=5e13;
int dx[]={-,,,};
int dy[]={,,-,};
 
int f[N][],g[N][],a[N];
 
int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
}
 
void add(int i,int x)
{
int k=i;
per(j,,) f[i][j]=f[i-][j],g[i][j]=g[i-][j];
per(j,,)
if(x>>j)
{
if(!f[i][j])
{
f[i][j]=x;
g[i][j]=k;
break;
}
else
{
if(k>g[i][j])
{
swap(k,g[i][j]);
swap(x,f[i][j]);
}
x^=f[i][j];
}
}
}
 
int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
//int cas=read();
//while(cas--)
//{
int n=read();
rep(i,,n)
rep(j,,) f[i][j]=g[i][j]=;
int lastans=;
rep(i,,n)
{
a[i]=read();
add(i,a[i]);
}
int m=read();
while(m--)
{
int l=read(),r=read();
lastans=;
per(i,,)
if((lastans^f[r][i])>lastans&&g[r][i]>=l) lastans^=f[r][i];
printf("%d\n",lastans);
}
 
//}
 
 
 
 
return ;
}

【CF1100F】Ivan and Burgers(线性基,分治)的更多相关文章

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

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

  2. CF1100F Ivan and Burgers

    题目地址:CF1100F Ivan and Burgers 一道有难度的线性基题,看了题解才会做 预处理两个数组: \(p_{r,i}\) 表示满足下列条件的最大的 \(l\) :线性基第 \(i\) ...

  3. BZOJ 4184 shallot 线性基+分治

    Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...

  4. 区间查询异或最大值——cf1100F,hdu6579(线性基)

    hdu6579 题意初始时有n个数,现在有q次操作: 查询[l,r]内选择一些数使得异或和最大:在末尾加入一个数.题目强制在线. 思路对于i我们记录[1,i]每个基底最靠近i的位置和这个位置的值,然后 ...

  5. Codeforces1100F Ivan and Burgers 【整体二分】【线性基】

    题目分析: 一道近似的题目曾经出现在SCOI中,那题可以利用RMQ或者线段树做,这题如果用那种做法时间复杂度会是$log$三次方的. 采用一种类似于整体二分的方法可以解决这道题. 将序列的线段树模型建 ...

  6. Codeforces1100F. Ivan and Burgers(离线+线性基)

    题目链接:传送门 思路: 按查询的右端点离线. 然后从左到右维护线性基. 每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底. 用ci维护后更新右端点为i的答案. 代码(析构1000ms,别 ...

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

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

  8. F. Ivan and Burgers(线性基,离线)

    题目链接:http://codeforces.com/contest/1100/problem/F 题目大意:首先输入n,代表当前有n个数,然后再输入m,代表m次询问,每一次询问是询问区间[l,r], ...

  9. Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)

    F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...

随机推荐

  1. Fiddler抓包ios亲测

    1 打开Fiddler设置端口 2 设置可以抓取https选项 3 手机连接WIFI和电脑处于同一局域网并设置代理端口和fiddler中设置一致 4 证书安装手机浏览器输入代理电脑ip及端口如192. ...

  2. Shell生成随机密码

    #tr参数 -c或——complerment:取代所有不属于第一字符集的字符: -d或——delete:删除所有属于第一字符集的字符: 1.生成10个小写字母 [root@kafka60 shell] ...

  3. hexo博客yilia主题深度设置

    转载:Shuyan http://dongshuyan.com/2019/05/24/hexo博客注意事项/ 1.微信分享异常 这里是themes\yilia\layout\ _partial\pos ...

  4. C++ std::isnan等函数的使用

    C和C++11标准提供了类似于isnan.isfinite.isinf.isnormal.fpclassify分别用于判断是非数(NaN)值.有限制.无穷值.正常数值等. 今天在使用Modbus读取设 ...

  5. 55-python基础-python3-字典-删除键值对-del语句

    字典-键值对的彻底删除 对于字典中不再需要的信息,可使用del 语句将相应的键—值对彻底删除. 使用del 语句时,必须指定字典名和要删除的键. 注意  删除的键—值对永远消失了.

  6. php 模拟登陆(不带验证码)采集数据

    这里模拟表单登陆窗口 提交代码部分 1,生成session_id保存到 cookie $login_url = 'http://www.96net.com.cn/Login.php';$cookie_ ...

  7. vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin

    场景: . webpack2.4.*集成vue-loader@15.7.2报错 原因: 参考官方文档 https://vue-loader.vuejs.org/migrating.html#a-plu ...

  8. 前端 ----- 初探ES6 Promise

    前段时间做项目,在调用接口的时候,遇到了异步问题.开始是使用定时器,发现效果并不理想,于是又用了回调,效果还好但是,很明显的影响了代码的整洁性. 于是我想起了在面试的那段时间,背过的面试题里,出现过一 ...

  9. vsftpd.service: Main process exited, code=exited, status=2/INVALIDARGUMENT和vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法

    今天在配置VSFTPD过程中遇到两个错误 1是启动失败,通过 SERVICE VSFTPD STATUS 查看到报错 May 02 16:06:58 debian systemd[1]: Starti ...

  10. @Profile使用及SpringBoot获取profile值

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Fmuma/article/details ...