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语句执行的速度变慢,如果一直这样增长下去,总有一天会爆炸的.怎么办??怎么办?? 第一:想到的必然是 添加索引 ...
随机推荐
- [极客大挑战 2019]Secret File 1
题目的名字就暗示我们考点文件隐藏进入页面查看源码 得到隐藏的界面点击访问 点击给的"SECRET"按钮页面出现提示"没看清么?回去再仔细看看吧.",说明响应的时 ...
- C#无损压缩图片
/// <summary> /// 根据指定尺寸得到按比例缩放的尺寸,返回true表示以更改尺寸 /// </summary> /// <param name=" ...
- Java中的四种权限修饰符及六种非访问修饰符(简识)
一.是哪四种访问权限修饰符呢? public > protected > [default] > private (公共的 ) (受保护的) (默认的) (私有的) 二.简单认识四种 ...
- Aibabelx-shop 大型微服务架构系列实战之技术选型
一.本项目涉及编程语言java,scala,python,涉及的技术如下: 1.微服务架构: springboot springcloud mybatisplus shiro 2.全文检索技术 sol ...
- CSS网页的布局
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- ubuntu修改默认启动内核
一.序言 新换的笔记本由于太新的主板芯片,驱动还没有完善.每次升级系统内核都要小心谨慎.经常发生部分硬件驱动失败的事情.系统Ubuntu 20.04.2 LTS x86_64 ,我现在使用的两个版本的 ...
- C# 输出一个字符串的前缀、后缀和它的子串(信息内容安全 实验一)
一.什么是前后缀 字符串的前缀:符号串左部的任意子串(或者说是字符串的任意首部) 字符串的后缀:符号串右部的任意子串(或者说是字符串的任意尾部) 举例:比如 101110 它的前缀就是空串.1.10. ...
- shiro报错SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".和Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
未能加载类"org.slf4j.impl.StaticLoggerBinder" 解决方案: <dependency> <groupId>org.slf4j ...
- 论Redis分布式锁的正确使用姿势
前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...
- 【linux】命令-网络相关
目录 前言 1. ifconfig 1.1 语法 1.2 参数说明 1.3 例程 2. iw 2.1 扫描可用无线网络 2.2 WiFi连接步骤(教程A) 2.2.1 查看可以用无线设备信息 2.2. ...