hdu5798
官方题解:
考虑去掉abs符号,发现只有相邻两个数的最高位被影响了才会影响abs的符号,所以可以按照最高位不一样的位置分类,之后考虑朴素枚举x从0到2^20,每次的复杂度是O(400),无法通过,考虑优化,第一种方法是用DFS来进行枚举,第二种则是加入记忆化
用dfs枚举简单一点
#include<bits/stdc++.h> using namespace std;
typedef long long ll;
int d[],n,mx,ansx;
ll anss,c[][];
void dfs(int i,int x,ll s)
{
if (s>anss) return;
if (i>mx)
{
if (s<anss||(s==anss&&x<ansx))
{
anss=s;
ansx=x;
}
return;
}
for (d[i]=; d[i]<=; d[i]++)
{
ll ns=s+c[i][i];
for (int j=; j<i; j++)
if (d[i]^d[j]) ns-=c[i][j];
else ns+=c[i][j];
dfs(i+,x+d[i]*(<<i),ns);
}
} int work(int a,int b,int h)
{
if (a<b) swap(a,b);
for (int i=h; i>=; i--)
c[h][i]+=((a>>i&)-(b>>i&))<<i;
} int main()
{
int cas;
scanf("%d",&cas);
while (cas--)
{
scanf("%d",&n);
int a,b;
scanf("%d",&a);
memset(c,,sizeof(c));
mx=;
for (int i=; i<n; i++)
{
scanf("%d",&b);
int h=;
while (h>=&&!((a>>h&)^(b>>h&))) h--;
work(a,b,h);
a=b;
}
while (mx>=&&!c[mx][mx]) mx--;
anss=1e18; ansx=;
dfs(,,);
printf("%d %lld\n",ansx,anss);
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int d[],n,mx,ansx;
ll anss,c[][];
void dfs(int i,int x,ll s)
{
if (s>anss) return;
if (i>mx)
{
if (s<anss||(s==anss&&x<ansx))
{
anss=s;
ansx=x;
}
return;
}
for (d[i]=; d[i]<=; d[i]++)
{
ll ns=s+c[i][i];
for (int j=; j<i; j++)
if (d[i]^d[j]) ns-=c[i][j];
else ns+=c[i][j];
dfs(i+,x+d[i]*(<<i),ns);
}
} int work(int a,int b,int h)
{
if (a<b) swap(a,b);
for (int i=h; i>=; i--)
c[h][i]+=((a>>i&)-(b>>i&))<<i;
} int main()
{
int cas;
scanf("%d",&cas);
while (cas--)
{
scanf("%d",&n);
int a,b;
scanf("%d",&a);
memset(c,,sizeof(c));
mx=;
for (int i=; i<n; i++)
{
scanf("%d",&b);
int h=;
while (h>=&&!((a>>h&)^(b>>h&))) h--;
work(a,b,h);
a=b;
}
while (mx>=&&!c[mx][mx]) mx--;
anss=1e18; ansx=;
dfs(,,);
printf("%d %lld\n",ansx,anss);
}
}
hdu5798的更多相关文章
- hdu5798 Stabilization
温习一下多校的题目 这题主要抓住一点,亦或值的贡献是固定的 所以按位搜索即可 #include<bits/stdc++.h> using namespace std; typedef lo ...
随机推荐
- 如何使用Navicat连接Oracle
1.Navicat连接Oracle,需要使用OCI库.因此先要安装Oracle提供的客户端instantclient-basic, 请注意,32位的Navicat需要下载配置32位的instantcl ...
- 牛客练习赛42 出题的诀窍(数学+hash)
出题的诀窍 题目链接:https://ac.nowcoder.com/acm/contest/393/C 题解: 由于他是在每一行选取一个元素,然后纵向来比较,这里行的顺序是不会影响的,所以我们将每一 ...
- FileProvider记录下
Mark下FileProvider,阿里巴巴Android开发手册有如下要求:[强制]应用间共享文件时,不要通过放宽文件系统权限的方式去实现,而应使用FileProvider. 知识点记录:1. An ...
- C语言双链表遍历,插入,删除
#include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memse ...
- struts2常用标签之数据标签
数据标签1 property标签 property标签的主要属性: value:用来获取值的OGNL表达式,如果value属性值没有指定,那么将会被设定为top,也就是返回位于值栈最顶端的对象. ...
- 超酷算法-BK树
前几天无意间遇到一个博客,觉得写得挺好的,自己之前的时候有个不好的习惯,那就是遇到了好资源第一反应就是收藏起来然后却很少再看!!这是坏习惯,要改!于是今天就开始通读了,读的第二篇是BK树.觉得有点意思 ...
- Spring的使用优点
spring事物配置,声明式事务管理和基于@Transactional注解的使用 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者 ...
- UIView显示时遮挡导航栏的方法
[self.navigationController.view:addSubview];
- 【洛谷 P4180】【模板】严格次小生成树[BJWC2010](倍增)
题目链接 题意如题. 这题作为我们KS图论的T4,我直接打了个很暴力的暴力,骗了20分.. 当然,我们KS里的数据范围远不及这题. 这题我debug了整整一个晚上还没debug出来,第二天早上眼前一亮 ...
- js_在原有的日期上添加天数输出添加后的日期
开始编码工作也有段时间了,想想没有留下点什么,有点遗憾.学到的一些经验,写写,分享一下.也给自己整理一下. 今天分享一下,在原有的日期上添加天数输出添加后的日期.开始做的时候,简单的思路是,直接用ne ...