CF 768B
题意:
In each operation Sam must remove any element x, such that x>1, from the list and insert at the same position x/2,x%2,x/2 sequentially. He must continue with these operations until all the elements in the list are either 0 or 1.
给定一个数N,对大于1的数在原来的位置拆分为N/2,N%2,N/2三个数。对拆分出的大于1的数同样进行拆分,直至所有的数均为0或1。
Now the masters want the total number of 1s in the range l to r (1-indexed).
对拆分后的0/1序列,询问L到R区间中1的数量

类似于线段树的区间查询
思路1:简单题,递归思想。对于给定的N,可以计算出最终0/1序列的长度。递归模拟,一层层往下分解,将得到的数分解到序列的对应指定位置中,当无法分解时则返回值,最后递归得到区间内所有的1的个数
      这里我担心被卡,用了一个位运算小优化。其实不用也可以。
Code:
#include<cstdio>
typedef long long ll;
ll n,ql,qr,len=1,ans;
ll dfs(ll n,ll l,ll r){
    if(n==0||l>qr||r<ql) return 0;
    if(n==1) return 1;
    ll mid=l+r>>1;
    return dfs(n>>1,l,mid-1)+dfs(n&1,mid,mid)+dfs(n>>1,mid+1,r);
}
int main(){
    scanf("%I64d%I64d%I64d",&n,&ql,&qr);
    for(ll x=n;x>1;x>>=1,len=len<<1|1);
    ans=dfs(n,1,len);
    printf("%I64d\n",ans);
    return 0;
}
思路2:求出区间端点的前缀和相减,拆分的个数符合f(n)=2*f(n-1)+1,而n拆后的区间和一定是n,所以用二分找出端点位置即可

最新文章

  1. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
  2. 19.Java 注解
  3. MySQL分区表的管理~1
  4. 【vue.js权威指南】读书笔记(第二章)
  5. YUM安装提示PYCURL ERROR 6 - "Couldn&#39;t错误的解决办法
  6. input、select等表单元素的对齐问题
  7. uva live 6170
  8. [改善Java代码]Java的泛型是类型擦除的
  9. css.day03.eg
  10. 啊上班的二号i将诶
  11. Hybrid App(一)App开发选型
  12. CSS 的优先级机制[总结]
  13. 安装PyQt5时缺少designer.exe的解决办法
  14. [题目] Luogu P3707 [SDOI2017]相关分析
  15. InterBase 数据库与驱动 版本不同
  16. TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)
  17. CSS3关于-webkit-tap-highlight-color属性
  18. Kafka学习之路 (四)Kafka的安装
  19. python 元组查找元素返回索引
  20. 2017头条笔试题:二维点集中找出右上角没有点的点并按x坐标从小到大打印坐标

热门文章

  1. C# IEnumerable接口
  2. 阿里巴巴 Java 开发手册(一):命名风格
  3. json_rpc_2 implementation
  4. PS利用蒙版抠图
  5. 【i.MX6UL/i.MX6ULL开发常见问题】单独编译内核,uboot生成很多文件,具体用哪一个?
  6. python检测远程udp端口是否打开的代码
  7. let 和 var 定义变量的区别
  8. MySQL Install--编译安装MySQL 5.7
  9. Java开发环境之ElasticSearch
  10. MySQL-查看DB文件位置