JZOJ 5382. 数列
题目大意
给出数列 \(\text a\),询问区间 \([l,r]\) 内,满足 \(l\le i \le j\le r\) 的 \(i,j\) 使 \(a_i xor a_{i+1} xor...xor a_j\) 值最大,求这个最值
题解
这题比较新鲜,知道了一些从未知道的套路
先考虑 \(O(n^2 \log V)\) 的做法
显然对于询问 \([l,r]\) 扫一遍,用 \(Trie\) 经典地贪心求最大值即可
然后发现我们可以把扫一遍的 \(O(n)\) 级别的复杂度弄掉
就是考虑分块
求出从第 \(i\) 块第一个位置为起点到第 \(j\) 个位置的答案
可以 \(O(n\sqrt n \log V)\) 预处理出
然后查询直接查预处理的数组就可以跳过块,暴力求散的答案即可
\(Code\)
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int N = 20005;
int n, q, t, size, a[N], sm[N], sum[64 * N], tr[32 * N][2], rt[N];
inline void update(int u , int v , int x)
{
for(register int i = 30; i >= 0; i--)
{
int c = (x >> i) & 1;
sum[v] = sum[u] + 1;
tr[v][c] = ++size;
tr[v][c ^ 1] = tr[u][c ^ 1];
v = tr[v][c] , u = tr[u][c];
}
sum[v] = sum[u] + 1;
}
inline int query(int u , int v , int x)
{
int res = 0;
for(register int i = 30; i >= 0; i--)
{
int c = (x >> i) & 1 , k = sum[tr[v][c ^ 1]] - sum[tr[u][c ^ 1]];
if (k) res += (1 << i) , u = tr[u][c ^ 1] , v = tr[v][c ^ 1];
else u = tr[u][c] , v = tr[v][c];
}
return res;
}
int st[N], ed[N], bl[N], g[155][N];
void Square()
{
int num = sqrt(n);
for(register int i = 1; i <= num; i++) st[i] = n / num * (i - 1) + 1, ed[i] = n / num * i;
ed[num] = n;
for(register int i = 1; i <= num; i++)
for(register int j = st[i]; j <= ed[i]; j++) bl[j] = i;
for(register int i = 1; i <= num; i++)
for(register int j = st[i]; j <= n; j++) g[i][j] = max(g[i][j - 1], query(rt[max(st[i] - 2, 0)], rt[j], sm[j]));
}
int main()
{
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
scanf("%d%d%d", &n, &q, &t);
for(register int i = 1; i <= n; i++) scanf("%d", &a[i]), sm[i] = sm[i - 1] ^ a[i];
update(0, rt[0] = ++size, 0);
for(register int i = 1; i <= n; i++) update(rt[i - 1] , rt[i] = ++size , sm[i]);
Square();
for(int l, r, ans = 0; q; --q)
{
scanf("%d%d", &l, &r);
l = (l + t * ans) % n + 1, r = (r + t * ans) % n + 1;
if (l > r) swap(l, r);
ans = 0;
int x = bl[l], y = bl[r];
if (x == y) for(register int i = l - 1; i <= r; i++) ans = max(ans, query(rt[max(l - 2, 0)], rt[r], sm[i]));
else{
ans = g[x + 1][r];
for(register int i = l - 1; i <= ed[x]; i++) ans = max(ans, query(rt[max(l - 2, 0)], rt[r], sm[i]));
for(register int i = st[y]; i <= r; i++) ans = max(ans, query(rt[max(l - 2, 0)], rt[r], sm[i]));
}
printf("%d\n", ans);
}
}
JZOJ 5382. 数列的更多相关文章
- 【Luogu P2201】【JZOJ 3922】数列编辑器
题面: Description 小Z是一个爱好数学的小学生.最近,他在研究一些关于整数数列的性质. 为了方便他的研究,小Z希望实现一个叫做"Open Continuous Lines Pro ...
- JZOJ 5922. sequence
5922. [NOIP2018模拟10.23]sequence (File IO): input:sequence.in output:sequence.out Time Limits: 1000 m ...
- [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...
- 题解【CJOJ2608】[JZOJ 100043]第k小数
P2608 - [JZOJ 100043]第k小数 Description 有两个非负整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- PAT 1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- fibonacci数列(五种)
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
随机推荐
- C# Math 中的常用的数学运算
〇.动态库 System.Math.dll 引入动态库 using System.Math; Math 为通用数学函数.对数函数.三角函数等提供常数和静态方法,使用起来非常方便,下边简单列一下常用 ...
- oracle第二步创建表空间、用户、授权
Windows+r→键入sqlplus,输入已安装好的oracle数据库超级管理员账号密码登录.显示: 成功. 创建表空间: 创建用户并默认表空间: 授权该创建用户对数据库的操作: 代码: SQL&g ...
- Springboot整合thymeleaf报错whitelabel page
1.SpringBootApplication未放在最外层 2.application.properties未配置spring.thymeleaf.check-template-location=tr ...
- JavaEE课程复习1--数据库相关操作
〇.本模块内容简介 30=(DB5+前端5+Web Core15+Project5) Junit.注解 MySQL.JDBC.JDBCUtils.c3p0.Druid连接池及工具类.JDBCTempl ...
- 【实时数仓】Day05-ClickHouse:入门、安装、数据类型、表引擎、SQL操作、副本、分片集群
一.ClickHouse入门 1.介绍 是一个开源的列式存储数据库(DBMS) 使用C++编写 用于在线分析查询(OLAP) 能够使用SQL查询实时生成分析数据报告 2.特点 (1)列式存储 比较: ...
- Flask框架使用SQLAlchemy的ORM
SQLAlchemy 1.介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用 ...
- C语言函数值传递问题
C语言函数间值传递问题 错误示例 #include <stdio.h> int * pop() { int a[3]; // 定义的局部变量a[3]在调用完之后自动释放其空间 int i ...
- python之路50 ORM执行SQL语句 操作多表查询 双下线方法
ORM执行查询SQL语句 有时候ORM的操作效率可能偏低 我们是可以自己编写SQL的 方式1: models.User.objects.raw('select * from app01_user;') ...
- 写一个 Markdown 博客客户端
这个"伪需求"是最近才想到的. 关于文章管理的想法,说来话长.我最初是在 CSDN 写技术文章,就用网页上的编辑器.后来在 CppBlog 写,用上了 Windows Live W ...
- [cocos2d-x]飞机大战 遇到的bug和总结(二)
第一点 声音文件最好不要使用mp3格式,因为我在同时使用背景音乐和playeffect()的时候,出现了bug,两者的音效不能同时出现(应该是格式问题),并且声音在windows上运行的时候加载非常慢 ...