hdu5014 构造b数列使得t最大(小想法)
题意:
给你一个序列a,他有n+1个数,每个数的范围是ai >= 0 && a[i] <= n,同时任意两个数字都是不相同的,就是ai != aj (i!=j),然后让你构造一个序列b,这个序列的要求与a序列一样,最后要求构造的b是使 t = (a0 ^ b0) + (a1 ^ b1) + ...+ (an ^ bn)最大。
思路:
一开始想的太简单了,因为题目要求的是每个数字都只能用一次,一开始我的想法是根据n的奇偶,来单独处理,处理的时候也是根据每个ai的奇偶来处理的,结果wa了,现在来说下正确的解法吧,这个题目我用的正确解法有点贪心的意思,我们每次先找到一个最大的2^k的数字,这个数字要小于等于n,从它开始枚举,往两边扩,如果不能扩了就找到当前没有被找出来的最大的那个2^k继续扩,不怎么好解释,自己在纸上多写几个连续的二进制数,然后模拟下很容易懂的,这里面有一个很容易让人怀疑的地方就是可能大数的那个方向会有剩余,其实不用担心这个,不可能有剩余,因为如果以某一个数为中心往两侧扩的话,只要前面扩到头了,也就是到1了,那么后面一定是mark完的了,因为扩到1相当于自己*2了,也就是2^(k+1)了,要是没有看懂什么意思,那么就自己找几个连续的二进制数模拟下就行了。
#include<stdio.h>
#include<string.h>
#include<stack> #define N 110000
using namespace std; int mark[N];
int num[N] ,Ans[N]; int main ()
{
int n ,i ,tmp;
while(~scanf("%d" ,&n))
{
for(i = 0 ;i <= n ;i ++)
scanf("%d" ,&num[i]);
stack<int>my_sk;
tmp = 1;
while(1)
{
my_sk.push(tmp);
tmp <<= 1;
if(tmp > n) break;
}
memset(mark ,0 ,sizeof(mark));
memset(Ans ,0 ,sizeof(Ans));
while(!my_sk.empty())
{
int L = my_sk.top() - 1;
int R = L + 1;
my_sk.pop();
while(1)
{
if(L < 0 || R > n || mark[L] || mark[R])
break;
mark[L] = mark[R] = 1;
Ans[L] = R ,Ans[R] = L;
L -- ,R ++;
}
}
__int64 ans = 0;
for(i = 0 ;i <= n ;i ++)
ans += (__int64)(num[i] ^ Ans[num[i]]);
printf("%I64d\n" ,ans);
for(i = 0 ;i <= n ;i ++)
if(i == n) printf("%d\n" ,Ans[num[i]]);
else printf("%d " ,Ans[num[i]]);
}
return 0;
}
hdu5014 构造b数列使得t最大(小想法)的更多相关文章
- hdu3006 状态压缩+位运算+hash(小想法题)
题意: 给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路: 是个小想法题目,要用到二进制压缩,位运算, ...
- 【bzoj5118】Fib数列2 费马小定理+矩阵乘法
题目描述 Fib定义为Fib(0)=0,Fib(1)=1,对于n≥2,Fib(n)=Fib(n-1)+Fib(n-2) 现给出N,求Fib(2^n). 输入 本题有多组数据.第一行一个整数T,表示数据 ...
- [bzoj5118]Fib数列2_费马小定理_矩阵乘法
Fib数列2 bzoj-5118 题目大意:求Fib($2^n$). 注释:$1\le n\le 10^{15}$. 想法:开始一看觉得一定是道神题,多好的题面啊?结果...妈的,模数是质数,费马小定 ...
- Fib数列2 费马小定理+矩阵乘法
题解: 费马小定理 a^(p-1)=1(mod p) 这里推广到矩阵也是成立的 所以我们可以对(2^n)%(p-1) 然后矩阵乘法维护就好了 模数较大使用快速乘
- CodeForces 714E Sonya and Problem Wihtout a Legend(单调数列和DP的小研究)
题意:给你n个数字,每个数字可以加减任何数字,付出变化差值的代价,求最后整个序列是严格单调递增的最小的代价. 首先我们要将这个题目进行转化,因为严格单调下是无法用下面这个dp的方法的,因此我们转化成非 ...
- 两个有序数列找第k小
给定一个数组,数组中的数据无序,在一个数组中找出其第k个最小的数,例如对于数组x,x = {3,2,1,4,5,6},则其第2个最小的数为2 两个有序数组 找第k小 * 方案一 合并遍历 * 二:游 ...
- 关于APP自动化工程的一点小想法
首先谈一下APP自动化测试面临的一些局限性? 答:测试业务的不明确性,APP逻辑复杂,界面的跳转变化随时间变化. 测试本身的不确定性,如不定时弹窗问题. 测试环境不稳定性,主要是网络的稳定性. 测试接 ...
- 学习selenium python版最初的一个小想法
这个还是我在刚开始学习selenium的时候做的,自己觉得有点意思,在接下来我会基于目前我对于selenium的一些深入研究,写下我对selenium的理解以及UIAutomation的一些理解,以此 ...
- 对MySQL数据量日益增长产生的一点小想法
最近一直在想一个问题 MySQL数据量日益庞大,目前单表总记录数有 300W+,导致sql语句执行的速度变慢,如果一直这样增长下去,总有一天会爆炸的.怎么办??怎么办?? 第一:想到的必然是 添加索引 ...
随机推荐
- POJ-1847(SPFA+Vector和PriorityQueue优化的dijstra算法)
Tram POJ-1847 这里其实没有必要使用SPFA算法,但是为了巩固知识,还是用了.也可以使用dijikstra算法. #include<iostream> #include< ...
- pytorch(01)环境配置及安装
pytorch pytorch定位:深度学习框架 人工智能:多领域交叉科学技术 机器学习:计算机智能决策算法 深度学习:高效的机器学习算法 pytorch实现模型训练需要5个模块 数据 将数据从硬盘读 ...
- 1.1 Python3基础-前言
>>返回主目录 Python 交互式代码 Python 脚本式代码 第一段Python代码: print('Hello World!') >>返回主目录
- 【测试技术分享】在Linux下安装Python3
导语:Python在linux环境下没有安装包,同时很多系统没有Python环境,即使有Python环境也是Python2.x,顺应时代,现在开始进行安装Python3的教程. 一.安装依赖 sudo ...
- url里bookmark是什么意思
<a rel="bookmark" href="abc.com"> 点击查看 </a> rel 这个属性的全称是 relationsh ...
- [笔记] CRT & exCRT
[笔记] CRT & exCRT 构造法 求多组\(x \equiv r_i (\bmod d_i)\)的解,\(d_i\)互质 余数\((r_i = remainder)\),除数\((d_ ...
- 仿String()构造器函数 【总结】
需求 实现以下方法: 控制台结果: 需求分析: 首先确定new调用的this和什么对象绑定,如果跟默认返回的对象绑定肯定做不到 [ ] 这样的访问,所以要在构造器内部返回一个包装过的数组 1.leng ...
- 【Spring Cloud & Alibaba全栈开源项目实战】:SpringBoot整合ELK实现分布式登录日志收集和统计
一. 前言 其实早前就想计划出这篇文章,但是最近主要精力在完善微服务.系统权限设计.微信小程序和管理前端的功能,不过好在有群里小伙伴的一起帮忙反馈问题,基础版的功能已经差不多,也在此谢过,希望今后大家 ...
- kiali的服务降级和暗隐的有关问题
记录两个问题 1. 服务在kiali的Applications 和 Workloads 显示为降级状态 2. 服务已经删除后在kiali的 Graph 显示依然存在 前言 istio部署到预发集群后, ...
- java面试一日一题:如何优化sql
问题:请讲下在mysql下如何优化sql 分析:该问题主要考察对mysql的优化,重点考虑对索引优化的掌握. 回答要点: 主要从以下几点去考虑, 1.什么样的sql需要优化? 2.怎么对sql进行优化 ...