bzoj 2741
题目描述:这里
一道非常好的题
由于强制在线,我们必须要用一些数据结构来处理
考虑分块:将整个序列分块,块内部分预处理,块外部分暴力处理
对于每个块,计算出以这个块的左端点为端点,向右枚举这个块以后的所有点,然后记录下这样一个区间的最大异或值
然后每次查询的时候直接调用即可
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
struct Trie
{
int to[];
int ed;
}tree[];
struct node
{
ll v;
int rq;
int num;
friend bool operator < (node a,node b)
{
return a.v<b.v;
}
};
priority_queue <node> M;
int rt[];
ll a[];
int n,k;
int tot=;
void ins(ll x,int now,int las)
{
rt[now]=++tot;
now=rt[now],las=rt[las];
for(int i=;i>=;i--)
{
tree[now]=tree[las];
tree[now].ed++;
if((x>>i)&)tree[now].to[]=++tot,now=tree[now].to[],las=tree[las].to[];
else tree[now].to[]=++tot,now=tree[now].to[],las=tree[las].to[];
}
tree[now].ed=tree[las].ed+;
}
ll query(int lq,int rq,ll x,int rk,int temp)
{
if(temp==-)return ;
int t=((x>>temp)&)?:;
int sum=tree[tree[rq].to[t]].ed-tree[tree[lq].to[t]].ed;
if(sum>=rk)return query(tree[lq].to[t],tree[rq].to[t],x,rk,temp-)+(1ll<<temp);
else return query(tree[lq].to[t^],tree[rq].to[t^],x,rk-sum,temp-);
}
int main()
{
scanf("%d%d",&n,&k);
n++;
ins(,,);
for(int i=;i<=n;i++)scanf("%lld",&a[i]),a[i]^=a[i-],ins(a[i],i,i-);
for(int i=;i<=n;i++)M.push((node){query(rt[],rt[i],a[i],,),i,});
ll ans=;
for(int i=;i<=k;i++)
{
node temp=M.top();
M.pop();
ans+=1ll*temp.v;
if(temp.num<temp.rq)M.push((node){query(rt[],rt[temp.rq],a[temp.rq],temp.num+,),temp.rq,temp.num+});
}
printf("%lld\n",ans);
return ;
}
bzoj 2741的更多相关文章
- bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
- BZOJ 2741 【FOTILE模拟赛】L(可持久化trie)
http://www.lydsy.com/JudgeOnline/problem.php?id=2741 思路:我们先将a变成a的异或前缀,这样问题就变成了,在l-1到r区间内,找出i,j令a[i]^ ...
- bzoj 2741 可持久化trie
首先我们设si为前i个数的xor和,那么对于询问区间[i,j]的xor和,就相当于si-1^sj,那么对于这道题的询问我们可以处理处si,然后对于询问[l,r],可以表示为在区间[l-1,r]里找两个 ...
- bzoj 2741 分块+可持久化trie
多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\ ...
- BZOJ 2741: 【FOTILE模拟赛】L [分块 可持久化Trie]
题意: 区间内最大连续异或和 5点调试到现在....人生无望 但总算A掉了 一开始想错可持久化trie的作用了...可持久化trie可以求一个数与一个数集(区间中的一个数)的最大异或和 做法比较明显, ...
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- BZOJ - 2741 分块维护最大连续异或和
题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2 ...
- bzoj 2741: 【FOTILE模拟赛】L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- bzoj 2741 [FOTILE模拟赛] L
Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...
随机推荐
- Azure DevOps
Azure DevOps https://azure.microsoft.com/zh-cn/services/devops/ It looks great!
- python 学习三
list循环删除下标会出错 L = [1,1,1,2,3,4,5]#list是根据下标来取值 #下标0,1,2,3,4,5,6 循环后下标错位 输出的结果是[1,2,4],把1也取到了 #l2 = [ ...
- MT【327】两道不等式题
当$x,y\ge0,x+y=2$时求下面式子的最小值:1)$x+\sqrt{x^2-2x+y^2+1}$2)$\dfrac{1}{5}x+\sqrt{x^2-2x+y^2+1}$ 解:1)$P(x,y ...
- CSS中各种居中的问题
1.元素水平居中 1.1 在父元素上使用text-align: center; father { text-align: center; } 1.2 margin: 0 auto; 在上一个问题中,我 ...
- Python 防止mysql 注入的两种方式
Python防止sql注入一般有两种方法 1.escape_string MySQLdb.escape_string(param) 注意:如果报错出现 'ascii' codec can't en ...
- pytest 13 使用自定义标记mark
前言: pytest可以规定那些要跑,那些不跑,跑特定的哪些?比如以下的这个例子: #!/usr/bin/env/python # -*-coding:utf-8-*- import pytest @ ...
- h5实现本地图片或文件的上传
首先放一个今天学到的小demo: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- Vim-latex 插件 的安装
ref:https://www.jianshu.com/p/ddd825064062 Vim-latex 插件 1. 安装 Vim-latex 插件是一个强大的Latex插件, 它的安装方法是: 将下 ...
- 一秒钟带你走进P图世界-----(python)PIL库的使用
python-----PIL库的使用 一.什么是PIL库 1.PIL(Python Image Library)库是python语言的第三方库,具有强大的图像处理能力,不仅包含了丰富的像素.色彩操作功 ...
- js手写'Promise'
/* * pending:初始化成功 * fulfilled:成功 * rejected:失败 * */ function Promise(executor) {// 执行器 this.status ...