【CF1100F】Ivan and Burgers(线性基,分治)
题意:给定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(线性基,分治)的更多相关文章
- codeforces 1100F Ivan and Burgers 线性基 离线
题目传送门 题意: 给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值. 思路:离线加线性基. 线性基学习博客1 线性基 ...
- CF1100F Ivan and Burgers
题目地址:CF1100F Ivan and Burgers 一道有难度的线性基题,看了题解才会做 预处理两个数组: \(p_{r,i}\) 表示满足下列条件的最大的 \(l\) :线性基第 \(i\) ...
- BZOJ 4184 shallot 线性基+分治
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...
- 区间查询异或最大值——cf1100F,hdu6579(线性基)
hdu6579 题意初始时有n个数,现在有q次操作: 查询[l,r]内选择一些数使得异或和最大:在末尾加入一个数.题目强制在线. 思路对于i我们记录[1,i]每个基底最靠近i的位置和这个位置的值,然后 ...
- Codeforces1100F Ivan and Burgers 【整体二分】【线性基】
题目分析: 一道近似的题目曾经出现在SCOI中,那题可以利用RMQ或者线段树做,这题如果用那种做法时间复杂度会是$log$三次方的. 采用一种类似于整体二分的方法可以解决这道题. 将序列的线段树模型建 ...
- Codeforces1100F. Ivan and Burgers(离线+线性基)
题目链接:传送门 思路: 按查询的右端点离线. 然后从左到右维护线性基. 每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底. 用ci维护后更新右端点为i的答案. 代码(析构1000ms,别 ...
- CodeForces - 1100F:Ivan and Burgers (线性基&贪心)(离线 在线)
题意:给定N个数,Q次询问,求区间最大异或和. 思路:一开始想的线性基+线段树.单次线性基合并的复杂度为20*20,结合线段树,复杂度为O(NlogN*20*20):显然,超时. 超时代码: #inc ...
- F. Ivan and Burgers(线性基,离线)
题目链接:http://codeforces.com/contest/1100/problem/F 题目大意:首先输入n,代表当前有n个数,然后再输入m,代表m次询问,每一次询问是询问区间[l,r], ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
随机推荐
- JS-立即执行函数表达式(IIFE)
javascript 函数调用 在 javascript 中,每一个函数在被调用的时候都会创建一个执行上下文,在该函数内部定义的变量和函数只能在该函数内部被使用,而正是因为这个上下文,使得我们在调用函 ...
- 今天刚到货的小米平板2,就出现dnx fastboot mode一直卡死黑屏
http://bbs.xiaomi.cn/t-11786254 今天刚到货的小米平板2,就出现dnx fastboot mode一直卡死黑屏, 发表在晒机评测2015-11-30 14:22:57 来 ...
- Mac005--VS&webstorm前端开发工具安装
Mac--Visual studio Code工具安装(企业常用) 安装网址:https://code.visualstudio.com/download 设置格式: 1.配置工作区与终端字体大小 常 ...
- deepin下安装配置git
https://blog.csdn.net/menglinjie/article/details/77145537 1.安装gitsudo apt-get install git12.配置用户名和邮箱 ...
- docker hub 本地镜像登录
docker的登录信息存放在home目录下的.docker文件夹下,查看 cat ~/.docker/config.json { "auths": { "gcyimgs. ...
- Excelvba从文件中逐行读取并写入excel中
Sub 読み込む() Dim result As Long Dim dialog As FileDialog Set dialog = Application.FileDialog(msoFileDi ...
- yum安装时出现No more mirrors to try.
可能原因:可能是不正常删除造成的 解决方法: yum clean allyum makecacheyum -y update 然后重新安装
- wireshark自动化之tshark命令行
tshark是wireshark安装目录下命令行工具 使用tshark可以通过自动化方式调用wireshark tshark -a duration:30 抓包30秒-w cap.cap 保存为cap ...
- git-ssh-keygen
ssh-keygen 先看本地是否已经有了密钥 cd ~/.ssh 该文件夹下会包含两个文件 id_rsa --私钥 id_rsa.pub --公钥 如果没有这两个文件的话就需要重新生成(有的话使用一 ...
- LeetCode Array Easy 448. Find All Numbers Disappeared in an Array
Description Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear ...