【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个数,然后有多个询问,每次回答询问所给出的区 ...
随机推荐
- tools-eclipse-003-下载安装优化
一.下载 1.1.jdk安装 下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装:不需要安装jre,默认会 ...
- python实现获取文件夹中的最新文件
实现代码如下: #查找某目录中的最新文件import osclass FindNewFile: def find_NewFile(self,path): #获取文件夹中的所有文件 lists = os ...
- Hibernate入门1
Hibernate概述: 1. 什么是框架: 写程序,在使用框架之后,帮我们实现一部分的功能,使用框架的好处可以少写一部分代码实现功能 2. 什么是hibernate框架: hibernate框架应用 ...
- dp(01背包问题)
且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need( ...
- [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)
[Codeforces 639F] Bear and Chemistry(Tarjan+虚树) 题面 给出一个n个点,m条边的无向图(不保证连通,可能有自环和重边),有q次询问,每次询问给出p个点和q ...
- Cnblogs 的 MetaWeblog 的接口发生了变化
Cnblogs 的 MetaWeblog 的接口发生了变化 */--> Cnblogs 的 MetaWeblog 的接口发生了变化 最近把 emacs 重新配置了一下,把 cnblogs 包也重 ...
- python第一部分小结
1.python的种类 Cpython: ...
- ecshop 广告调用的几种方式
1,ECSHOP后台设置广告更换 前台调用 {insert name='ads' id=2 num=1} id值表达广告位置的id.num表示数量 2,在代码加函数 function getads($ ...
- 广播模式下的生产者与消费者fanout模式
生产者 #coding=utf-8 import pika import sys connection = pika.BlockingConnection(pika.ConnectionParamet ...
- js操作对象属性用点和用中括号有什么不同
书读百遍其义自见 学习<JavaScript设计模式>一书时,学习工厂模式这一章节,发现了对象后使用中括号的情况,如下: var Factory=function(type,content ...