hdu 5798 Stabilization(dfs+巧妙利用二进制位)

题目链接:hdu 5798 Stabilization

题意:

给出一个序列Ai,可以让每个Ai异或上一个x使得最小,问最小值以及使得该值最小的最小x值

题解:

首先枚举x,然后如何来算得出的价值呢,巧妙的利用A[i]与A[i-1]的二进制位关系。

详细题解传送门

 1 #include<bits/stdc++.h>
 2 #define mst(a,b) memset(a,b,sizeof(a))
 3 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 4 using namespace std;
 5 typedef long long ll;
 6
 7 const int N=1e5+7;
 8 int t,n,a[N],x,mx;
 9 ll dp[22][22],ans;
10
11 void dfs(int pos,ll sum,int now)
12 {
13     if(pos>mx)
14     {
15         if(sum<ans)ans=sum,x=now;
16         else if(sum==ans)x=min(x,now);
17         return;
18     }
19     F(i,0,1)
20     {
21         ll tmp=sum+dp[pos][pos];
22         F(j,0,pos-1)if(((now>>j)&1)==i)tmp+=dp[pos][j];
23         else tmp-=dp[pos][j];
24         dfs(pos+1,tmp,now+(i<<pos));
25     }
26 }
27
28 int main(){
29     scanf("%d",&t);
30     while(t--)
31     {
32         mst(dp,0),mx=0,ans=0,x=0;
33         scanf("%d",&n);
34         F(i,1,n)scanf("%d",a+i);
35         F(i,2,n)
36         {
37             int ta=max(a[i],a[i-1]),tb=min(a[i],a[i-1]);
38             int pos=19;ans+=ta-tb;
39             while(pos>=0&&!(((ta^tb)>>pos)&1))pos--;
40             mx=max(mx,pos);
41             for(int j=pos;j>=0;j--)
42                 dp[pos][j]+=((ta>>j)&1)-((tb>>j)&1);
43         }
44         F(i,0,mx)F(j,0,i)dp[i][j]<<=j;
45         dfs(0,0,0);
46         printf("%d %lld\n",x,ans);
47     }
48     return 0;
49 }

时间: 2024-12-18 19:29:43

hdu 5798 Stabilization(dfs+巧妙利用二进制位)的相关文章

HDU 5798 Stabilization

题目简述: 给定一个正整数序列(序列长度$n \le 10^5$)数字大小 $ < 2 ^ {20}$ 现选定一个正整数数$x$与原序列中所有的数异或 然后问操作之后的序列相邻两数差的绝对值之和最小是多少 在满足该值最小的前提下 最小的$x$又是多少 --------------------------------------------------------------------------------------- 比赛时拉着一名队友磕了$1h+$ 然后乱写了一发就弃了 比赛后看了官方题

Unity手机开发之巧妙利用纹理制作滚动背景

巧妙利用纹理制作滚动背景 本次学习的主要知识点有以下: 1.如何创建滚动背景. 可以利用材质球,让其不断地偏移纹理,就可以达到这样的效果. 2.time 和deltaTime的区别[狗刨学习网] Time.time是表示游戏从开始到现在的时间,是一个增长值. Time.deltaTime是表示机器上帧与帧之间的时间间隔,是一个固定值. 使用方法是创建一个材质球,贴上我们想要的背景,让Panel附上材质球,调整好摄像机的位置,将脚本挂在我们之前创建的Panel上. using UnityEngin

HDU 4921 Map DFS+状态压缩+乘法计数

算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久,其实因为只能取某个链的前缀,所以直接取链长加+1 然后相乘即可,当然因为会出现都是空的那种情况,要去掉,全部乘完之后,要-1 然后就是算权值了,权值等于当前加进来的点的总和 以及 等级相同的点的加成,并不是特别好算,这时候考虑每个状态下的点对全局的贡献,对,就是这个思想,用状态压缩来表示状态,然后这

巧妙利用访问时间提取和重组代码的实践

说明 本文主要介绍巧妙利用访问时间提取和重组某嵌入式产品SDK代码的实践. 一  问题提出 目前产品平台为便于编译管理,要求各模块组织为include-source目录结构,分别存放头文件和源文件.但芯片厂家提供的SDK按功能划分为众多子目录,如subdir1(.c,.h)…subdirN(.c,.h)…Makefile,并将头文件和源文件一并存放在各子目录内. 此外,厂家SDK支持多种管理场景,通过选项开关编译不同的目录和文件.而产品硬件定板后管理场景固定,其他场景所涉及的代码将不再需要. 因

巧妙利用快速排序法的原理求一个数组中的第10大元素

//快速排序法 int QuickSort_process3(int *a, int low, int high) { int l, h, temp; l = low; h = high; temp = a[low]; while (l < h){ while (l< h&&a[h] >= temp) --h; if (l < h) a[l] = a[h]; while (l < h&&a[l] < temp) ++l; if (l &l

Marvolo Gaunt&#39;s Ring(巧妙利用前后缀进行模拟)

Description Professor Dumbledore is helping Harry destroy the Horcruxes. He went to Gaunt Shack as he suspected a Horcrux to be present there. He saw Marvolo Gaunt's Ring and identified it as a Horcrux. Although he destroyed it, he is still affected

HDU 1258 Sum It Up(dfs 巧妙去重)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1258 Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7758    Accepted Submission(s): 4067 Problem Description Given a specified total t a

HDU 1175 连连看(DFS)

Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去.不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的.现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过.玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能

hdu 1501 Zipper dfs

题目链接: HDU - 1501 Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.For examp