【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 费用:免 ...
随机推荐
- Java写Excel(不生成实体文件,写为流的形式)
java 写 Excel(不生成实体文件,写为流的形式) public String exportReportExcel(String mediaCode, List<SimpleMediaRe ...
- Python学习手册之Python异常和文件
在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9963 ...
- python 装饰器 (多个装饰器装饰一个函数---装饰器前套一个函数)
#带参数的装饰器 #500个函数 # import time # FLAGE = False # def timmer_out(flag): # def timmer(func): # def inn ...
- linux实现DNS轮询实现负载平衡
DNS 轮询机制会受到多方面的影响,如:A记录的TTL时间长短的影响:别的 DNS 服务器 Cache 的影响:windows 客户端也有一个DNS Cache.这些都会影响 DNS 轮询的效果.因此 ...
- backtrace函数
1.函数原型 #include <execinfo.h> int backtrace(void **buffer, int size); 该函数获取当前线程的调用堆栈,获取的信息将会被存放 ...
- 生産管理(PP)
伝票系 製造指図 マスタ系 生産資源/治工具 作業区 能力 作業手順 作業バージョン 作業記録 需要予測プロファイル 計画手配 MRP レシピ その他 カスタマイズ系 BOM関連 製造指図確認 伝票系 ...
- HBase java API 的使用范例(增,删,查,扫描)
编辑pom.xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase ...
- JAVA大作业汇总3
JAVA大作业3 代码 ``` package thegreatwork; import java.util.; import java.io.; /Board.java 目的:里面有一些关于如何移动 ...
- 小白学习mysql 之 innodb locks
Innodb 锁类型: Shared and Exclusive Locks Intention Locks Record Locks Gap Locks Next-Key Locks Insert ...
- DDD领域驱动设计基本理论知识总结(转)
领域驱动设计之领域模型 为什么建立一个领域模型是重要的 领域通用语言(UBIQUITOUS LANGUAGE) 将领域模型转换为代码实现的最佳实践 领域建模时思考问题的角度 领域驱动设计的经典分层架构 ...