题面
可以证明,在最后一次÷2÷2操作之前,不必要进行连续的两次−1-1操作。因为连续的−1-1操作可以通过先÷2÷2来减少操作次数。
我们定义popcount(x)popcount(x)来表示xx二进制表示中11的个数,那么假设做了kk次÷2÷2操作(可以发现kk不会超过6060),那么可以把所有操作等价为:
1. −p-p (p<2k)(p,耗费popcount(p)popcount(p)次操作。
2. ÷2k÷2^k,耗费kk次操作。
3. −d-d,耗费dd次操作。
可以发现,经过前两次操作,一些数x变成了x÷2kx÷2^k,而另一些变成了x÷2k−1x÷2^k-1。这取决于xmod2kx mod 2^k与pp的大小关系。
设这些余数为CiC_i。那么对于每一个区间(Ci−1,Ci](C_{i-1},C_i],p取这个区间的任意值得出的序列都是等价的。
那我们会得到k∗nk*n个序列,每一个序列都有一个最少已经消耗的操作次数k+minpopcount(Ci−1,Ci]k+minpopcount(C_{i-1},C_i],但是两个差分之后相同的序列是可以通过操作3相互转化的。
那么我们把差分序列相同的分成一类,那么一类中首项相同也就序列相同,每个序列的首项有一个取值范围[a1−K+k+minpopcount(Ci−1,Ci],a1][a_1-K+k+minpopcount(C_{i-1},C_i],a_1],那么就相当于给定若干区间求并集长度的问题了,每一类DP一下即可。
总复杂度O(60∗n2∗log(n∗60))O(60* n^2 * log(n*60))。
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int mod=1000000007;
int n,top,num;
ll K,a[210],c[210],d[210];
pair<ll,ll> qj[12010];
struct node
{ll t[210],a1;int k;
}s[12010];
bool operator <(const node &a,const node &b)
{for(int i=1;i<n;i++)if(a.t[i]<b.t[i]) return 1;else if(a.t[i]>b.t[i]) return 0;return 0;
}
bool check(node &a,node &b)
{for(int i=1;i<n;i++)if(a.t[i]!=b.t[i]) return 0;return 1;
}int maxpop(ll x,ll y)
{if(x==-1) return 0;int re=0;for(int i=60;i>=0;i--)if(((x>>i)&1)==((y>>i)&1)) re+=((x>>i)&1);else {re++;break;}return re;
}
ll dp()
{sort(qj+1,qj+num+1);ll re=0,l=0,r=-1;for(int i=1;i<=num;i++){if(qj[i].first>r) {re+=(r-l+1);l=qj[i].first;}r=qj[i].second;}re+=(r-l+1);return re;
}
int main()
{scanf("%d%lld",&n,&K);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+n+1);    for(int i=0;i<=60;i++){for(int j=1;j<=n;j++)c[j]=(a[j]&((1ll<<i)-1));   sort(c+1,c+n+1);c[0]=-1;int sz=unique(c+1,c+n+1)-c-1;for(int j=1;j<=sz;j++)if(a[1]>=c[j]){int P=maxpop(c[j-1],c[j]);for(int l=1;l<=n;l++)d[l]=((a[l]-c[j])>>i);  s[++top].a1=d[1];s[top].k=i+P;for(int l=1;l<n;l++)s[top].t[l]=d[l+1]-d[l];        }}sort(s+1,s+top+1);num=0;ll ans=0;for(int i=1;i<=top;i++){if(i!=1&&!check(s[i],s[i-1])) ans=(ans+dp())%mod,num=0; if(s[i].k<=K)qj[++num]=make_pair(max(s[i].a1-K+s[i].k,0ll),s[i].a1);}ans=(ans+dp())%mod;printf("%lld",ans);return 0;
}

[ARC086]F - Shift and Decrement 位运算+数论+DP相关推荐

  1. [CodeForces gym 102956 D] Bank Security Unification(位运算优化dp)

    problem cf链接 solution 读完题先直接暴力 dpdpdp 拿出来,dpi=max⁡j<i{dpj+(fi&fj)}dp_i=\max_{j<i}\big\{dp_ ...

  2. 【BZOJ4300】绝世好题,位运算相关DP

    传送门 思路: 按照每一位来进行DP f[i]f[i]表示最后一个数的第i个二进制为1的最长子序列个数 每次转移时把a[i]a[i]拆成二进制位,然后取数为1的位上f<script type=& ...

  3. 【位运算】解题报告:luoguP4310 绝世好题(位运算优化DP)

    题目链接:luoguP4310 绝世好题 这是链接 因为答案只能是由两个在二进制表示下至少有一位同是1的a序列里的数&得到的,最后求子序列的个数 f[i]存的是对于a序列中当前遍历到的数中有几 ...

  4. 算法笔记(五)数论、进制、位运算、统计抽样、计算几何

    layout: post title: 算法笔记(五)数论.进制.位运算.统计抽样.计算几何 description: 算法笔记(五)数论.进制.位运算.统计抽样.计算几何 tag: 算法 算法笔记( ...

  5. 数学--数论--快速幂--最大公约数--位运算模板

    ACM常用模板合集 //位运算求解最大公约数 long long gcd(long long a,long long b) { if(a<b) return gcd(b,a);if(b==0) ...

  6. 为什么地磅的读数有进制么_谈谈二进制(三)——位运算及其应用

    0. 概要 前两篇文章我们了解了二进制的基本原理(谈谈二进制(一))以及二进制的四则运算(谈谈二进制(二)),本篇我们一起来看看二进制的位运算.先来看一下有哪些位运算: 上表中列出了我们编程语言中的所 ...

  7. 计算机中的进制位运算

    为什么计算机用二进制计数: 计算机是由电路构成的,电路只有0和1 两种状态. 不同进制间的换算: 在十进制中,个位的1代表10⁰=1,十位的1代表10¹=10,百位的1代表10²=100,所以:123 ...

  8. [翻译]位运算暗黑魔导书

    原文地址:http://graphics.stanford.edu/~seander/bithacks.html 有本书叫hack's delight也是主讲位运算的. 下面正文开始翻译吧,不定时更新 ...

  9. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算

    题目链接:https://www.luogu.org/problem/P1896 题意:n*n的格子填数,每个数填放位置的周围(8个)不能有其他的数 n<=9 ,矩形状压 f[i][j][s], ...

最新文章

  1. centos7 使用无线wifi连接
  2. git push代码到远程新分支
  3. Java并发编程的基础-Thread.interrupted
  4. (转)Spring Boot 2 (二):Spring Boot 2 尝鲜-动态 Banner
  5. OpenCV-python学习笔记(四)——smoothing and blurring平滑和模糊
  6. Servlet的学习之web路径问题
  7. 5个超实用的自媒体工具
  8. 腾讯 AI Lab招聘算法实习生
  9. 电脑重装系统后台式电脑网卡坏了怎么修复
  10. 苹果手机充值显示服务器异常,球球大作战iOS会员充值异常解决办法
  11. Ubuntu系统下安装Sailfish的SDK
  12. autosar中com模块_AUTOSAR架构的CAN通讯
  13. F2812 Flash烧写总结
  14. arduino处理中频信号_接收机的中频处理技术
  15. 抓取崔庆才个人博客网站前端源码
  16. 我这三年---mugen篇(2) by 皇峰尖
  17. 【python+情人节】玩个俄罗斯方块都是爱你的形状——三、自动拼图
  18. 思维导图---考研高数---极限---笔记--汤家凤
  19. C语言 矩阵相加,数乘
  20. 工资没涨,为什么突然税越扣越多了

热门文章

  1. 让搜索引擎收录hexo博客 | hexo
  2. 中国云计算行业研究报告
  3. python实现word文档合并
  4. LCD显示异常分析——撕裂(tear effect)
  5. 基于AD603的AGC电路
  6. 多智能体强化学习:合作关系设定下的多智能体强化学习
  7. python加权求和_加权随机算法的python实现
  8. 计算机在英语中有哪些运用,计算机在英语教学中的运用
  9. linux:awk之RS、ORS与FS、OFS
  10. 【HTML】HTML网页设计---海贼王动漫网页设计