Codeforces1100F Ivan and Burgers 【整体二分】【线性基】
题目分析:
一道近似的题目曾经出现在SCOI中,那题可以利用RMQ或者线段树做,这题如果用那种做法时间复杂度会是$log$三次方的。
采用一种类似于整体二分的方法可以解决这道题。
将序列的线段树模型建出来,将每个询问自顶向下找,要么被分到某个区间,要么在当前区间被分成两半。
对于某个区间$[l,r]$,可以找到一个$mid$,求出所有$[i,mid]$和$[mid+1,i]$的线性基。注意到这样的话每个数被插入线性基的次数是树高次,所以求出这些想要的线性基的复杂度是$O(nlog^2n)$。
对于每个被分成两半的区间,可以找到一个$[i,mid]$和$[mid+1,j]$,拼起来,拼起来的复杂度是$O(log^2n)$,每个询问只被拼起来一次,所以时间复杂度是$O((n+q)log^2n)$
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,a[maxn],q,cal[maxn],ans[maxn];
pair<int,int> qy[maxn];
struct bs{int p[];}sl[maxn],rv[maxn]; void read(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&q);
for(int i=;i<=q;i++) scanf("%d%d",&qy[i].first,&qy[i].second);
} int merge(bs alpha,bs beta){
for(int i=;i<;i++){
if(beta.p[i] == ) continue;
for(int j=i;j>=;j--){
if(!(beta.p[i]&(<<j))) continue;
if(alpha.p[j]) beta.p[i] ^= alpha.p[j];
else {alpha.p[j] = beta.p[i];break;}
}
}
int as = ;
for(int i=;i>=;i--)if((as^alpha.p[i]) > as) as ^= alpha.p[i];
return as;
} void solve(int tl,int tr,int l,int r){
int mid = (tl+tr)/;
for(int i=l;i<=r;i++) rv[i] = rv[];
for(int i=mid;i>=tl;i--){
sl[i] = sl[i+]; int hh = a[i];
for(int j=;j>=;j--){
if(!((<<j)&hh)) continue;
if(sl[i].p[j]) hh ^= sl[i].p[j];
else{sl[i].p[j] = hh; break;}
}
}
for(int i=l;i<=r;i++) rv[i] = sl[qy[i].first];
for(int i=tl;i<=mid;i++) sl[i] = sl[];
for(int i=mid+;i<=tr;i++){
sl[i] = sl[i-]; int hh = a[i];
for(int j=;j>=;j--){
if(!((<<j)&hh)) continue;
if(sl[i].p[j]) hh^=sl[i].p[j];
else {sl[i].p[j] = hh; break;}
}
}
for(int i=l;i<=r;i++) ans[cal[i]] = merge(rv[i],sl[qy[i].second]);
for(int i=mid+;i<=tr;i++) sl[i] = sl[];
} void divide(int tl,int tr,int l,int r){
if(l > r) return;
if(tl == tr){for(int i=l;i<=r;i++) ans[cal[i]] = a[tl]; return;}
int mid = (tl+tr)/,num = l-;
for(int i=l;i<=r;i++)
if(qy[i].second<=mid)num++,swap(cal[i],cal[num]),swap(qy[i],qy[num]);
divide(tl,mid,l,num);
int num2 = num;
for(int i=num+;i<=r;i++)
if(qy[i].first>mid)num2++,swap(cal[i],cal[num2]),swap(qy[i],qy[num2]);
divide(mid+,tr,num+,num2);
solve(tl,tr,num2+,r);
} int main(){
read();
for(int i=;i<=q;i++) cal[i] = i;
divide(,n,,q);
for(int i=;i<=q;i++) printf("%d\n",ans[i]);
return ;
}
Codeforces1100F Ivan and Burgers 【整体二分】【线性基】的更多相关文章
- Codeforces1100F. Ivan and Burgers(离线+线性基)
题目链接:传送门 思路: 按查询的右端点离线. 然后从左到右维护线性基. 每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底. 用ci维护后更新右端点为i的答案. 代码(析构1000ms,别 ...
- Ivan and Burgers CodeForces - 1100F (线性基)
大意: 给定n元素序列, m个询问$(l,r)$, 求$[l,r]$中选出任意数异或后的最大值 线性基沙茶题, 直接线段树暴力维护两个log还是能过的 #include <iostream> ...
- Codeforces 1100 F - Ivan and Burgers
F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...
- 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 1100F Ivan and Burgers 线性基 离线
题目传送门 题意: 给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值. 思路:离线加线性基. 线性基学习博客1 线性基 ...
- 【CF1100F】Ivan and Burgers(线性基,分治)
题意:给定n个数,每个数为c[i],有q个询问,每次询问从第l个到第r个数字的最大xor和 n,q<=5e5,c[i]<=1e6,时限3s 思路:直接线段树维护区间线性基是3个log,会T ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
- CodeForces 1100F Ivan and Burgers
CodeForces题面 Time limit 3000 ms Memory limit 262144 kB Source Codeforces Round #532 (Div. 2) Tags da ...
随机推荐
- 【代码笔记】Web-JavaScript-JavaScript void
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 全球排名第一的免费开源ERP Odoo 12产品上海发布会报名开始
Odoo V12 产品上海发布会暨企业数字化转型论坛 点击进入活动报名通道 高成本的软件开发,耗时的系统安装,繁琐的操作培训… 这一系列问题都是企业数字化管理的痛点, "软件"成为 ...
- Apex 中的自定义迭代器
迭代器 迭代器(iterator)可以遍历一个集合变量中的每个元素.Apex提供了Iterator接口来让开发者实现自定义的迭代器. Iterator接口 Iterator接口定义了两个函数: has ...
- 如何获取Debug Android Hash Key
在接入FaceBook第三方登录的时候,需要获取Android Hash Key. Android Hash Key即密钥散列有两种,一种是开发秘钥散列,一种是发布秘钥散列.这里主要介绍如何获取开发秘 ...
- Netty学习笔记(五) 使用Netty构建静态网页服务器
昨天在继续完善基于Netty构建的聊天室系统的过程中,发现了一个有意思的知识点,特此拿来做一个简单的静态网页服务器,好好的玩一玩Netty. 但是不管怎么说利用netty实现各种功能的流程都是类似的 ...
- redis 五大数据结构__常用命令
linux 下下载redis数据库 apt install redis 如果提示权限不够的话, 直接提权: sudo apt install redis-server linux启用.停止服务 ser ...
- ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ...
- Xamarin移动开发的优点和缺点
在考虑iOS或Android应用程序开发时,我们大多数人会首先考虑Objective-C vs Swift和Java.作为本地技术堆栈,当涉及到iOS和Android应用程序开发时,它们自然是最常用的 ...
- SQLServer之创建标量函数
创建标量函数注意事项 在 SQL Server 和 Azure SQL Database 中创建用户定义函数. 用户定义函数是接受参数.执行操作(例如复杂计算)并将操作结果以值的形式返回的 Trans ...
- SQLServer的三种Recovery Model
SQL Server恢复模式的三种类型的比较 此文章主要向大家讲述的是SQL Server恢复模式,我们主要介绍的是三种恢复模式,其中包括简单SQL Server数据库的恢复模式.完整恢复模式与大容量 ...