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 q 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的更多相关文章
- LightOJ 1269 Consecutive Sum (Trie树)
Jan's LightOJ :: Problem 1269 - Consecutive Sum 题意是,求给定序列的中,子序列最大最小的抑或和. 做法就是用一棵Trie树,记录数的每一位是0还是1.查 ...
- LightOJ 1269 - Consecutive Sum Trie树
题意:给出一串序列,求区间连续异或值的最大和最小. 思路:如果不是出在专题里,想不到可以用字典树做.先求前缀异或值,转为二进制,加入Trie树中,如果要求最大,就是尽可能走和当前位数字相反的,这样异或 ...
- Consecutive Sum LightOJ - 1269(区间异或和)
Consecutive Sum 又来水一发blog... 本来是昨天补codechef的题,最后一道题是可持久化字典树,然后去黄学长博客看了看 觉得字典树写法有点不太一样,就想着用黄学长的板子写码几道 ...
- hdoj 1977 Consecutive sum II
Consecutive sum II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 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 ...
- 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 ...
- BZOJ 2157: 旅游( 树链剖分 )
树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...
- Codeforces Round #747 (Div. 2) Editorial
Codeforces Round #747 (Div. 2) A. Consecutive Sum Riddle 思路分析: 一开始想起了那个公式\(l + (l + 1) + - + (r − 1) ...
- Codeforces Round #821(Div.2) (A-C) 题解
Codeforces Round #821(Div.2) (A-C) A.Consecutive Sum 大致题意 给定一组共 n 个数据 ,如果俩个数的下标在 mod k 意义下同余,则可以交换a[ ...
随机推荐
- PowerToys插件扩展(类似Alfred)
在mac系统除了自带的Spotlight还有一个很好用的工具叫Alfred image 在windows系统也有一个很好用的工具叫PowerToys,是微软的一个开源项目 image https:// ...
- Output of C++ Program | Set 18
Predict the output of following C++ programs. Question 1 1 #include <iostream> 2 using namespa ...
- Hibernate持久化标志符生成策略
generator子元素定义持久化标识符的生成策略,为持久化类对应的数据库表的主键找到了赋值方法,HIbernate默认将使用assigned的持久化标识符生成策略.关系型数据库的主键定义方式:(1) ...
- Linux基础命令---vmstat显示虚拟内存状态
vmstat vmstat指令用来显示虚拟内存使用状态,同时也可以显示进程.cpu活动情况.vmstat报告有关进程.内存.分页.块IO.陷阱和CPU活动的信息.生成的第一份报告给出了自上次重新启动以 ...
- MySQL(5):安装MySQL
下载地址 下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 安装步骤 第一步:下载得到压缩包,并解压 ...
- System.exit(-1)和return 的区别
对于只有一个单一方法的类或者系统来说是一样的,但是对于含有多个类和方法,且调用关系比较复杂时就不一样了. System.exit(-1)是指所有程序(方法,类等)停止,系统停止运行. return只是 ...
- vueAPI (data,props,methods,watch,computed,template,render)
data Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化.实例创建之后,可以通过vm.$data来访问原始数据 ...
- Linux Ubuntu18.04 安装配置 clash
我最近一段时间在搭建用于构建 Docker 镜像的开发测试环境,这个环境是一台运行于 Windows 笔记本上的虚拟机,其操作系统为 Ubuntu 18.04 .构建场景中经常要去 Github 获取 ...
- JS如何区分微信浏览器、QQ浏览器和QQ内置浏览器,解决 ios 无法判断是否为qq浏览器环境的问题 !!!
原理 通过不同移动端的ua弹窗 获取user-agent 参数包含的信息,进行判断浏览器类型 在Android上 QQ内置环境的ua中有关键字 MQQBrowser, 并且后面包含一个[空白符+QQ] ...
- [BUUCTF]PWN——inndy_rop
inndy_rop 附件 步骤: 例行检查,32位,开启了nx保护 本地调试运行没看出个啥,直接上ida,一开始f5会报错, 找到报错提示的位置,点击option–>general调出如图的界面 ...