1269 - Consecutive Sum
Time Limit: 3 second(s) Memory Limit: 64 MB

Little Jimmy is learning how to add integers. As in decimal the digits are 0 to 9, it makes a bit hard for him to understand the summation of all pair of digits. Since addition of numbers requires the knowledge of adding digits. So, his mother gave him a software that can convert a decimal integer to its binary and a binary to its corresponding decimal. So, Jimmy's idea is to convert the numbers into binaries, and then he adds them and turns the result back to decimal using the software. It's easy to add in binary, since you only need to know how to add (0, 0), (0, 1), (1, 0), (1, 1). Jimmy doesn't have the idea of carry operation, so he thinks that

1 + 1 = 0

1 + 0 = 1

0 + 1 = 1

0 + 0 = 0

Using these operations, he adds the numbers in binary. So, according to his calculations,

3 (011) + 7 (111) = 4 (100)

Now you are given an array of n integers, indexed from 0 to n-1, you have to find two indices i j in the array (0 ≤ i ≤ j < n), such that the summation (according to Jimmy) of all integers between indices i and jin the array, is maximum. And you also have to find two indices, p q in the array (0 ≤ p ≤ q < n), such that the summation (according to Jimmy) of all integers between indices p and in the array, is minimum. You only have to report the maximum and minimum integers.

Input

Input starts with an integer T (≤ 10), denoting the number of test cases.

Each case starts with a line containing an integer n (1 ≤ n ≤ 50000). The next line contains n space separated non-negative integers, denoting the integers of the given array. Each integer fits into a 32 bit signed integer.

Output

For each case, print the case number, the maximum and minimum summation that can be made using Jimmy's addition.

Sample Input

Output for Sample Input

2

5

6 8 2 4 2

5

3 8 2 6 5

Case 1: 14 2

Case 2: 15 1

Note

Dataset is huge, use faster I/O methods.

题意:求连续区间的异或的最大和最小值;

思路:trie树,贪心;

先求一遍前缀异或和;然后先将0加入tire树,0异或任何值为那个值本身,然后我们知道pre[i]^pre[j];j<i;

ans[j+1]^ans[j+2]...^ans[i];也就是区间[i,j],那么我们把前面的前缀加入tire,然后我们在树中贪心选取,如果是找最大的,就贪心选与当前位不同的,因为是按最高位

依次往下,所以我们保证高位数要尽量大,如果不存在与当前位相同,那么只能走相同的。知道咋贪心最大的,最小的和这差不多。

复杂度为(n*log(1<<31-1));

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<iostream>
6 using namespace std;
7 typedef long long LL;
8 LL ans[500005];
9 int id[32];
10 struct node
11 {
12 node *p[2];
13 node()
14 {
15 memset(p,0,sizeof(p));
16 }
17 };
18 node *root;
19 void in(int *v)
20 {
21 int i,j,k;
22 node *c=root;
23 for(i=30; i>=0; i--)
24 {
25 int pre=v[i];
26 if(c->p[v[i]]==NULL)
27 {
28 c->p[v[i]]=new node();
29 }
30 c=c->p[v[i]];
31 }
32 }
33 LL ma(int *v)
34 {
35 LL sum=0;
36 LL l=1;
37 node*c=root;
38 int i;
39 for(i=30; i>=0; i--)
40 {
41 int pre=v[i];
42 if(c->p[(pre+1)%2]==NULL)
43 {
44 c=c->p[pre];
45 sum*=2;
46 sum+=0;
47 }
48 else
49 {
50 c=c->p[(pre+1)%2];
51 sum*=2;
52 sum+=1;
53 }
54 }
55 return sum;
56 }
57 LL mi(int *v)
58 {
59 LL sum=0;
60 LL l=2;
61 node*c=root;
62 int i;
63 for(i=30; i>=0; i--)
64 {
65 int pre=v[i];
66 if(c->p[pre]==NULL)
67 {
68 c=c->p[(pre+1)%2];
69 sum*=2;
70 sum+=1;
71 }
72 else
73 {
74 c=c->p[pre];
75 sum*=2;
76 sum+=0;
77 }
78 }
79 return sum;
80 }
81 void del(node *c)
82 {
83 for(int i=0; i<2; i++)
84 {
85 if(c->p[i]!=NULL)
86 del(c->p[i]);
87 }
88 free(c);
89 }
90 int main(void)
91 {
92 int i,j,k;
93 scanf("%d",&k);
94 int s;
95 int n,m;
96 for(s=1; s<=k; s++)
97 {
98 scanf("%d",&n);
99 for(i=1; i<=n; i++)
100 {
101 scanf("%lld",&ans[i]);
102 ans[i]^=ans[i-1];
103 }
104 root=new node();
105 LL maxx=0;
106 LL minn=1e12;
107 memset(id,0,sizeof(id));
108 in(id);
109 for(i=1; i<=n; i++)
110 {
111 memset(id,0,sizeof(id));
112 LL kk=ans[i];
113 int cnt=0;
114 while(kk)
115 {
116 id[cnt++]=kk%2;
117 kk/=2;
118 }
119 maxx=max(maxx,ma(id));
120 minn=min(minn,mi(id));
121 in(id);
122 }del(root);
123 printf("Case %d: ",s);
124 printf("%lld %lld\n",maxx,minn);
125 }return 0;
126 }

1269 - Consecutive Sum的更多相关文章

  1. LightOJ 1269 Consecutive Sum (Trie树)

    Jan's LightOJ :: Problem 1269 - Consecutive Sum 题意是,求给定序列的中,子序列最大最小的抑或和. 做法就是用一棵Trie树,记录数的每一位是0还是1.查 ...

  2. LightOJ 1269 - Consecutive Sum Trie树

    题意:给出一串序列,求区间连续异或值的最大和最小. 思路:如果不是出在专题里,想不到可以用字典树做.先求前缀异或值,转为二进制,加入Trie树中,如果要求最大,就是尽可能走和当前位数字相反的,这样异或 ...

  3. Consecutive Sum LightOJ - 1269(区间异或和)

    Consecutive Sum 又来水一发blog... 本来是昨天补codechef的题,最后一道题是可持久化字典树,然后去黄学长博客看了看 觉得字典树写法有点不太一样,就想着用黄学长的板子写码几道 ...

  4. hdoj 1977 Consecutive sum II

    Consecutive sum II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. HDOJ(HDU) 1977 Consecutive sum II(推导、、)

    Problem Description Consecutive sum come again. Are you ready? Go ~~ 1 = 0 + 1 2+3+4 = 1 + 8 5+6+7+8 ...

  6. hdu 1231, dp ,maximum consecutive sum of integers, find the boundaries, possibly all negative, C++ 分类: hdoj 2015-07-12 03:24 87人阅读 评论(0) 收藏

    the algorithm of three version below is essentially the same, namely, Kadane's algorithm, which is o ...

  7. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  8. Codeforces Round #747 (Div. 2) Editorial

    Codeforces Round #747 (Div. 2) A. Consecutive Sum Riddle 思路分析: 一开始想起了那个公式\(l + (l + 1) + - + (r − 1) ...

  9. Codeforces Round #821(Div.2) (A-C) 题解

    Codeforces Round #821(Div.2) (A-C) A.Consecutive Sum 大致题意 给定一组共 n 个数据 ,如果俩个数的下标在 mod k 意义下同余,则可以交换a[ ...

随机推荐

  1. Hadoop入门 完全分布式运行模式-集群配置

    目录 集群配置 集群部署规划 配置文件说明 配置集群 群起集群 1 配置workers 2 启动集群 总结 3 集群基本测试 上传文件到集群 查看数据真实存储路径 下载 执行wordcount程序 配 ...

  2. 【STM32】WS2812介绍、使用SPI+DMA发送数据

    这篇要使用到SPI+DMA,需要了解的话,可以参考我另两篇博客 时钟:https://www.cnblogs.com/PureHeart/p/11330967.html SPI+DMA通信:https ...

  3. android 防止R被混淆,R类反射混淆,找不到资源ID

    在Proguard.cfg中添加 -keep class **.R$* { *;   }

  4. gitlab之实战部署

    #:准备Java环境,安装jdk root@ubuntu:~# cd /usr/local/src/ root@ubuntu:/usr/local/src# ls jdk-8u191-linux-x6 ...

  5. spring mvc idea创建

    创建项目 创建项目 --> Spring --> Spring MVC --> 下面选择Download,会显示Spring MVC-5版本 如果是首次使用IDEA,因为没有配置ma ...

  6. Linux:ps -ef命令

    ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同时执行 PS是LINUX下最常用的也是非常强大的进程查看命令 检查java 进程是否存在:ps -ef |g ...

  7. shell脚本采集系统cpu、内存、磁盘、网络信息

    有不少朋友不知道如何用shell脚本采集linux系统相关信息,包括cpu.内存.磁盘.网络等信息,这里脚本小编做下讲解,大家一起来看看吧. 一.cpu信息采集 1),采集cpu使用率采集算法:通过/ ...

  8. 【Python】CV2的一些基本操作

    ·导入: import cv2 ·读取图片: img = cv2.imread('路径') 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整 ...

  9. 【JavaScript】创建全0的Array

    1.创建一个长度为m的全0数组 var arr = new Array(m).fill(0); 2.创建一个m行n列的全0数组 var arr = new Array(m).fill(new Arra ...

  10. 莫烦python教程学习笔记——利用交叉验证计算模型得分、选择模型参数

    # View more python learning tutorial on my Youtube and Youku channel!!! # Youtube video tutorial: ht ...