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 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/7230931.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值