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. Git分布式版本控制系统基础

    查看创建的账号 下来在该当前的⽬录下创建⽂件,并且进⾏提交 使⽤git log就可以看到最近提交的⽇志记录的信息 查看窗户的状态信息 某些时候我们可能需要回退到之前的版本,那么具体处理的步骤为: 1. ...

  2. Vue相关,vue父子组件生命周期执行顺序。

    一.实例代码 父组件: <template> <div id="parent"> <child></child> </div& ...

  3. Spring Boot 创建定时任务(配合数据库动态执行)

    序言:创建定时任务非常简单,主要有两种创建方式:一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库 ...

  4. 如何在linux 上配置NTP 时间同步?

    故障现象: 有些应用场景,对时间同步的要求严格,需要用到NTP同步,如何在linux上配置NTP时间同步? 解决方案: 在linux 上配置NTP 时间同步,具休操作步骤,整理如下: 1.安装软件包( ...

  5. my37_MGR流控对数据库性能的影响以及MGR与主从的性能对比

    mysql> show variables like 'group_replication_flow_control_applier_threshold'; +----------------- ...

  6. SpringBoot切换Tomcat容器

    SpringBoot默认的容器为Tomcat, 依赖包在spring-boot-starter-web下 Xml代码 <dependencies> <dependency> & ...

  7. maven根据profile,resources,filters来区分部署环境

    项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...

  8. 通过DT10获取程序执行过程中的实时覆盖率

    DT10是新一代的动态测试工具,可以长时间跟踪记录目标程序执行情况,获取目标程序动态执行数据,帮助进行难于重现的Bug错误分析,覆盖率检测,性能测试,变量跟踪等等功能. 系统测试覆盖率,通常是用于判断 ...

  9. .Net Core MVC全局过滤器验证是否需要登录

    1.新增全局登录过滤器LoginCheckAttribute 1 public class LoginCheckAttribute: ActionFilterAttribute 2 { 3 publi ...

  10. Apifox(2)快速上手apifox

    快速上手 使用场景 Apifox 是接口管理.开发.测试全流程集成工具,使用受众为整个研发技术团队,主要使用者为前端开发.后端开发和测试人员. 前端开发 接口文档管理 接口数据 Mock 接口调试 前 ...