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 ...
随机推荐
- 0.react学习笔记-环境搭建与脚手架
0.环境搭建 笔者使用的是deepin/mac两种系统,因为两个电脑经常切换用.环境搭建没什么区别. 0.1 node安装 按照node官网叙述安装 # Using Debian, as root c ...
- android 仿微信表情雨下落!
文章链接:https://mp.weixin.qq.com/s/yQXn-YjEFSW1X7A7CcuaVg 众所周知,微信聊天中我们输入一些关键词会有表情雨下落,比如输入「生日快乐」「么么哒」会有相 ...
- Android PAI (PlayAutoInstall)预装APK 功能
最近刚找到工作,是手机方案公司,刚接触手机系统预装的APP,以及解决方案MTK平台下预装APP的bug,也接触到了Launcher的东西. 然后接触到了第一个需求 PAI预装APK功能 下面是我用到的 ...
- 使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署
目录 目录 1.基本概念 1.1.什么是智能合约? 1.2.什么是Solidity? 1.2.1.Solidity的语言特性 1.3.什么是 Browser-solidity? 2.Browser-s ...
- selenium-确定找到的element唯一(三)
在python + selenium 中经常会遇到找到的元素不唯一,导致定位到的元素不是预期的或者定位不到元素 解决方法:只要在页面进行确认找到的元素唯一后,再进行操作 页面确认方法: 1.通过htm ...
- 【记录】IntelliJ IDEA—IDEA2018-2019激活
摘要 最智能的java ide [有能力请支持正版] 1.将 0.0.0.0 account.jetbrains.com 和 0.0.0.0 www.jetbrains.com添加到 host ...
- 使用jquery实现选项卡切换效果
几张简陋的框架效果图 页面加载时: 选项卡操作后: css样式: <style type="text/css"> *{margin:0px;padding:0px;} ...
- Cs231n课堂内容记录-Lecture 4-Part2 神经网络
Lecture 7 神经网络二 课程内容记录:https://zhuanlan.zhihu.com/p/21560667?refer=intelligentunit 1.协方差矩阵: 协方差(Cova ...
- telnet操作memcache
1.使用方法 1. 连接到memcached telnet 192.168.1.100 11211 add name 0 60 5 [说明 add 是指令名 name 是key的名字 (是以 ...
- .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式
原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...