LightOJ 1269 Consecutive Sum (Trie树)
Jan's LightOJ :: Problem 1269 - Consecutive Sum
题意是,求给定序列的中,子序列最大最小的抑或和。
做法就是用一棵Trie树,记录数的每一位是0还是1。查询的时候,如果求最大值,就尽量让高位是1,相反就尽量让高位是0。
代码如下,1y:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int N = ;
const int M = ; struct Node {
int c[];
void init() { c[] = c[] = -;}
} ; struct Trie {
Node node[M * N];
int rt, curid;
void init() { rt = curid = ; node[curid++].init();}
void insert(int x, int dg = ) {
int p = rt;
for (int i = dg - , idx; i >= ; i--) {
idx = (x & << i) != ;
if (node[p].c[idx] == -) node[node[p].c[idx] = curid++].init();
p = node[p].c[idx];
}
}
int min(int x, int dg = ) {
int p = rt, ret = ;
for (int i = dg - , idx; i >= ; i--) {
idx = (x & << i) != ;
if (~node[p].c[idx]) p = node[p].c[idx], ret <<= , ret |= idx;
else p = node[p].c[!idx], ret <<= , ret |= !idx;
}
return ret;
}
int max(int x, int dg = ) {
int p = rt, ret = ;
for (int i = dg - , idx; i >= ; i--) {
idx = (x & << i) == ;
if (~node[p].c[idx]) p = node[p].c[idx], ret <<= , ret |= idx;
else p = node[p].c[!idx], ret <<= , ret |= !idx;
}
return ret;
}
} trie; int main() {
int T, n, x;
scanf("%d", &T);
for (int cas = ; cas <= T; cas++) {
scanf("%d", &n);
int ans1 = 0x80000000, ans2 = 0x7fffffff, sum = ;
trie.init();
trie.insert();
for (int i = ; i < n; i++) {
scanf("%d", &x);
sum ^= x;
//cout << sum << endl;
ans1 = max(ans1, trie.max(sum) ^ sum);
ans2 = min(ans2, trie.min(sum) ^ sum);
trie.insert(sum);
}
printf("Case %d: %d %d\n", cas, ans1, ans2);
}
return ;
}
其实做这题的时候想到一种比较麻烦的情况,那就是数里面有负数。这样的话需要对最高位特判,从而求得最大最小值。不过没有这样的数据,所以就不这么搞了。
——written by Lyon
LightOJ 1269 Consecutive Sum (Trie树)的更多相关文章
- LightOJ 1269 - Consecutive Sum Trie树
题意:给出一串序列,求区间连续异或值的最大和最小. 思路:如果不是出在专题里,想不到可以用字典树做.先求前缀异或值,转为二进制,加入Trie树中,如果要求最大,就是尽可能走和当前位数字相反的,这样异或 ...
- 1269 - Consecutive Sum
1269 - Consecutive Sum PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 64 MB ...
- LightOJ 1129 - Consistency Checker Trie树模板
题意:给出n条串判断是否存在一个串为另一个串的前缀. 思路:套Trie树的模板,先全部插入,再查找每个字串,如果查找字串完毕,但还存在下一个节点,说明存在前缀. /** @Date : 2016-11 ...
- hdu 4825 Xor Sum trie树
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Proble ...
- HDU4825 Xor Sum —— Trie树
题目链接:https://vjudge.net/problem/HDU-4825 Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- Consecutive Sum LightOJ - 1269(区间异或和)
Consecutive Sum 又来水一发blog... 本来是昨天补codechef的题,最后一道题是可持久化字典树,然后去黄学长博客看了看 觉得字典树写法有点不太一样,就想着用黄学长的板子写码几道 ...
- HDU 4825 Xor Sum (trie树处理异或)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- CodeForces979D:Kuro and GCD and XOR and SUM(Trie树&指针&Xor)
Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...
- HDU4825 Xor Sum(贪心+Trie树)
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...
随机推荐
- MySQL语句错误及解决方案
1.group by查询错误 ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contai ...
- drf模块及源码
drf中的APIView请求生命周期 APIView的as_view(局部禁用csrf) => 调用父类view中的as_view返回view()方法 => 自己的类调用自己的dispat ...
- R语言可视化--ggplot函数
上一篇说了qplot函数,现在说一下ggplot函数 本身不能实现,需要添加层才可以.ggplot2的核心函数 library(ggplot2) ggplot(airquality,aes(Wind, ...
- 解决WSL上运行plantUML中文乱码问题
生成UML图命令: java -jar plantuml.jar -charset UTF-8 my.txt 1. 保证my.txt 使用uft-8编码 2. wsl中安装中文字体: 如: sudo ...
- web前端学习(三)css学习笔记部分(1)-- css入门基础知识+基本样式
1.介绍及语法 1.1CSS概述: CSS指层叠样式表 CSS样式表极大地提高了工作效率 如果值大于一个单词,需要加上引号(意思是值只有一个的时候可以不加引号) 1.2CSS高级语法 1.选择器分组 ...
- go语言第一问:在其他地方执行编译go语言程序,结果会在哪个地方产生?
1.我们看执行编译go语言程序中命令,没有找到exe文件.
- 洛谷P1248 加工生产调度
流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...
- PHPCMS V9双语站建设切换
PHPCMS V9要做双语,很多同学都是迷茫的,在此特地分享我的双语制作步辶 我这种模式是把两个站点都改为HTML静态模式才可以实现 双语切换可分为两种模式: 1.解析二级域名来切换双语 解析二级域名 ...
- Eclipse Jobs 和后台进程
Eclipse后台进程 1.主线程(Main thread) 一个Eclipse客户端只能跑一个进程,但却可以创建很多线程. 在Eclipse框架中,会用一个单线程去运行所有的代码指令,这个线程执行客 ...
- MySQL安装后设置root 密码
Mysql安装完成后初始化root 密码为空,直接回车 使用命令行: mysqladmin -u root password "123456" 来设置root密码.这里我设置的密码 ...