【17.12.22.B】
B
题面描述:
给一个长度为n的序列,a[1], a[2], ... , a[n], 选出连续的k个数,使得这k个数的最大值加这k个数的or值最大。
假设选出的数为a[l], a[l + 1], ... , a[l + k -1],即求
max(a[l], a[l + 1], ... , a[l + k -1]) + (a[l] | a[l + 1] | ... | a[l + k -1])
对于所有的1 <= k <= n,输出答案
输入:
第一行输入一个n,第二行输入n个数,a[1], a[2], ... , a[n].
输出:
输出n行,每行一个整数。第i行表示k = i时的答案。
样例输入:
1 0 2
样例输出:
对于20%的数据,1 <= n <= 300
对于40%的数据,1 <= n <= 5000
对于100%的数据,1 <= n <= 200000, 0 <= a[i] < 2^16
【题解】
①注意到2^16了吗,有趣的地方就在这里了。
②结合|和+的定义我们可以知道,定义f[i]表示长度长度为i的序列的值最大,那么f[i]≥f[i-1];
③考虑求f[i],如果一个区间对我们的答案有贡献,那么区间的左右一定是最大值或能使异或值改变的值,而两边都是最大值的话去掉一个也无所谓,所以两边必定有一个能改变异或值的。
④可以做到了,枚举左右端点,然后维护其能改变其异或值的位置,最多16个,转移即可!
(建议看代码)
/*3
1 0 2
好想用linux啊~
其实代码很简单,但是思路很~~怎么说呢
精巧吧;
注意到|和+的单调 ,还有2^16这个数,很容易想到按位搞事情
其实自己是想到前半部分的,但是经验不够,不知道怎么运用,积累重要。
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <ctime>
#include <cmath>
#define inf 0x3f3f3f3f
#define ll long long
#define N 200010
#define mem(f,a) memset(f,a,sizeof(f))
#define Run(i,l,r) for(int i=l;i<=r;i++)
#define Don(i,l,r) for(int i=l;i>=r;i--)
#define Eun(i,u,E) for(int i=head[u],v=E[i].v;i!=-1;i=E[i].next,v=E[i].v)
using namespace std;
int n,a[N],pre[N],num[N],s[N],top,ans[N];
void solve()
{ mem(pre,); mem(num,); top=;
Run(i,,n){
while (top&&a[s[top-]]<=a[i]) top--;
s[top++]=i;
Run(j,,){
if (a[i]&(<<j)) {
pre[j]=i;
num[i]=a[i];
}
else num[pre[j]]|=a[i];
}
Run(j,,)if (pre[j]){
int l=,r=top-;
while (l<r){
int mid=(l+r)/;
if (s[mid]>=pre[j]) r=mid;
else l=mid+;
}
int maxn=a[s[l]];
ans[i-pre[j]+]=max(ans[i-pre[j]+],maxn+num[pre[j]]);
}
}
}
int main()
{ freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
scanf("%d",&n);
Run(i,,n){
scanf("%d",&a[i]);
}
solve();
Run(i,,n/) a[i]=a[n-i+];
solve();
Run(i,,n){
ans[i]=max(ans[i-],ans[i]);
printf("%d\n",ans[i]);
}
return ;
}//by tkys_Austin;
【17.12.22.B】的更多相关文章
- 【2017.12.22.A】
A 题面: 给一个n个点m条边的无向图,你可以选择一个点作为起点,然后沿着图中的边开始走,走的过程中,同一条边不能经过两次(相反的方向也不行). ...
- JAVA 基础编程练习题12 【程序 12 计算奖金】
12 [程序 12 计算奖金] 题目:企业发放的奖金根据利润提成.利润(I)低于或等于 10 万元时,奖金可提 10%:利润高于 10 万元, 低于 20 万元时,低于 10 万元的部分按 10%提成 ...
- P2240 【深基12.例1】部分背包问题
P2240 [深基12.例1]部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞.藏宝洞里面有 N(N \le 100)N(N≤100) 堆金币,第 ii 堆金币的总重量和总价值分别是 m_i,v ...
- 【6.12校内test】T2 子集
这道题大概是这三道题里最简单的啦 但这阻止不了我废的脚步 [问题描述] 对于 n=4 时,对应的集合 s={4,3,2,1},他的非空子集有 15 个依次如下: {1} {2} {1,2} {3} { ...
- 【6.12校内test】T3 城市交通费
要不我先去写T2吧(逃 先把题目搞上来: [问题描述] 有 n 个城市,编号 1~n.其中 i 号城市的繁华度为 pi.省内有 m 条可以双向同行的高速 公路,编号 1~m.编号为 j 的高速公路连接 ...
- 【c++习题】【17/5/22】重载数组下标操作符
一.写出程序运行结果 1#include <iostream > using namespace std; int a[10]={1,2, 3, 4, 5, 6, 7, 8, 9, 10} ...
- 【01月22日】A股滚动市盈率PE最低排名
深康佳A(SZ000016) - 滚动市盈率PE:1.55 - 滚动市净率PB:1.03 - 滚动年化股息收益率:4.71% - - - 深康佳A(SZ000016)的历史市盈率走势图 华菱钢铁(SZ ...
- 【6.12校内test】T1单词序列
[问题描述] 给出两个单词(开始单词和结束单词)以及一个词典.找出从开始单词转换到结束单词, 所需要的最短转换序列.转换的规则如下: 1.每次只能改变一个字母 2.转换过程中出现的单词(除开始单词和结 ...
- 30天,App创业从0到1【7.12西安站】
活动概况 时间:2015年07月12日13:30-16:30 地点:汇天使咖啡(高新路36号智空间二楼) 主办:APICloud.UPYUN.万紫网络 网址:www.apicloud.com 费用:免 ...
随机推荐
- php post提交xml文件
<?php header("Content-type: text/xml;"); // xml code demo $xmlData = '<?xml version= ...
- ECSHOP和SHOPEX快递单号查询申通插件V8.6专版
发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...
- 打印N个真值的所有真值组合
例:N=2 (true,true),(false,true),(true,false),(false,false) #include<stdio.h> int count=0; void ...
- 单片机C51 8位流水灯
#include<reg51.h> sbit P1_0=0X90; sbit P1_1=0x91; sbit P1_2=0x92; sbit P1_3=0x93; sbit P1_4=0x ...
- ABS(引数と同じ大きさの正の数を返す)
ABS 関数 [数値] 数値式の絶対値を返します. 構文 ABS( numeric-expression ) パラメータ numeric-expression 絶対値が返される数値. 戻り値 数値 ...
- 4364: [IOI2014]wall砖墙
4364: [IOI2014]wall砖墙 链接 分析: 线段树,维护一个最大值,一个最小值. 代码: #include<bits/stdc++.h> ],*p1 = buf,*p2 = ...
- Andrid 打印调用堆栈
public static void printCallStatck() { Throwable ex = new Throwable(); StackTraceElement[] stackElem ...
- C#窗口抖动
用过QQ的窗口抖动功能吧.是不是觉得很神奇?很有意思?其实,仔细想想,使用的原理还是挺简单的:让窗口的位置不断快速地发生变化. 说出了原理,是不是一下恍然大悟?顿时理解了.我以前也想过如何实现这个功能 ...
- 【WPF】 布局篇
[WPF] 布局篇 一. 几个常用且至关重要的属性 1. Width,Height : 设置窗体,控件宽高. 这里注意,WPF是自适应的, 所以把这2个属性设置 Auto, 则控件宽高会自动改变. 2 ...
- python,批量生成指定格式的审核数据(传输参数格式为数组时)
#思路#获取list长度(例如列表有20条数据,则生成20条数据),生成数组长度为list元素的数据,完成对列表20条数据的批量审核def createBatchData(self,str_in,li ...