【题目链接】:http://codeforces.com/contest/768/problem/B

【题意】



一开始给你一个数字n;

让你用这个数字n根据一定的规则生成序列;

(如果新生成的序列里面还有大于1的数字,就一直按着上面的规则重复生成);

最后让你统计在一个区间范围内的1的数目;

【题解】



一个树形的样子;

算出总共1的数目(整棵树的叶子节点上和节点的余数上)

这个挺好算的;

然后在从下往上走的时候记录每个节点的子树的size;

和子树所含的1的个数;



应该先算出总的size;

然后算出1..l-1里面1的数目和r+1..len里面1的数目;

(len为最后整个序列的长度);

用总的1的数目减去这两个数目就是答案了;

这里1的数目每次找高度最低的满足siz[rt]<=len-(r+1)+1或者siz[rt]<=l-1的节点,然后把它以下的1的数目统计一下就好;

然后再递归找子树,直到len-(r+1)+1和l-1都变成0为止;



【完整代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define rei(x) scanf("%d",&x)
  13. #define rel(x) scanf("%I64d",&x)
  14. typedef pair<int,int> pii;
  15. typedef pair<LL,LL> pll;
  16. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  17. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  18. const double pi = acos(-1.0);
  19. const int N = 100;
  20. LL n,l,r,a[N],siz[N],cnt1[N],total;
  21. LL sz[N];
  22. int num = 0;
  23. void fix(LL x)
  24. {
  25. if (x==2 || x==3)
  26. {
  27. num++;
  28. siz[num] = 3;
  29. sz[num] = x;
  30. if (x==2)
  31. cnt1[num]=2;
  32. else
  33. cnt1[num]=3;
  34. }
  35. else
  36. {
  37. fix(x>>1);
  38. num++;
  39. sz[num] = x;
  40. siz[num] = siz[num-1]*2+1;
  41. cnt1[num] = cnt1[num-1]*2+(x&1);
  42. }
  43. }
  44. int main()
  45. {
  46. //freopen("F:\\rush.txt","r",stdin);
  47. rel(n),rel(l),rel(r);
  48. //n==0 || n==1?
  49. if (n==0)
  50. {
  51. puts("0");
  52. return 0;
  53. }
  54. if (n==1)
  55. {
  56. puts("1");
  57. return 0;
  58. }
  59. fix(n);
  60. total = siz[num];
  61. //cnt右==size-(r+1)+1
  62. LL cnty = total-(r+1)+1;
  63. LL tempy = 0;
  64. if (cnty>0)
  65. {
  66. if (cnty==1)
  67. tempy++;
  68. else
  69. if (cnty==2)
  70. {
  71. if (cnt1[1]==3) tempy+=2;
  72. else
  73. tempy+=1;
  74. }
  75. else
  76. {
  77. while (cnty>=3)
  78. {
  79. rep1(i,1,num)
  80. if (cnty<=siz[i])
  81. {
  82. if (cnty==siz[i])
  83. {
  84. cnty=0;
  85. tempy+=cnt1[i];
  86. break;
  87. }
  88. cnty-=siz[i-1];
  89. tempy+=cnt1[i-1];
  90. if (cnty>0)
  91. {
  92. cnty--;
  93. tempy+=(sz[i]&1);
  94. }
  95. break;
  96. }
  97. }
  98. if (cnty==1)
  99. tempy++;
  100. else
  101. if (cnty==2)
  102. {
  103. if (cnt1[1]==3) tempy+=2;
  104. else
  105. tempy+=1;
  106. }
  107. }
  108. }
  109. //cnt左==l-1
  110. LL cntz = l-1;
  111. LL tempz = 0;
  112. if (cntz>0)
  113. {
  114. if (cntz==1)
  115. tempz++;
  116. else
  117. if (cntz==2)
  118. {
  119. if (cnt1[1]==3) tempz+=2;
  120. else
  121. tempz+=1;
  122. }
  123. else
  124. {
  125. while (cntz>=3)
  126. {
  127. rep1(i,1,num)
  128. if (cntz<=siz[i])
  129. {
  130. if (cntz==siz[i])
  131. {
  132. cntz=0;
  133. tempz+=cnt1[i];
  134. break;
  135. }
  136. cntz-=siz[i-1];
  137. tempz+=cnt1[i-1];
  138. if (cntz>0)
  139. {
  140. cntz--;
  141. tempz+=(sz[i]&1);
  142. }
  143. break;
  144. }
  145. }
  146. if (cntz==1)
  147. tempz++;
  148. else
  149. if (cntz==2)
  150. {
  151. if (cnt1[1]==3) tempz+=2;
  152. else
  153. tempz+=1;
  154. }
  155. }
  156. }
  157. LL tot = cnt1[num];
  158. LL ans = tot-tempz-tempy;
  159. cout << ans <<endl;
  160. return 0;
  161. }

【codeforces 768B】Code For 1的更多相关文章

  1. 【codeforces 765B】Code obfuscation

    [题目链接]:http://codeforces.com/contest/765/problem/B [题意] 让你把每个变量都依次替换成a,b,c,-.d这些字母; 且要按顺序先用a再用b-.c.d ...

  2. 【codeforces 799B】T-shirt buying

    [题目链接]:http://codeforces.com/contest/799/problem/B [题意] 告诉你每个人喜欢的衣服的颜色; 然后告诉你每件衣服的正面和背面的颜色以及它的价格; 只要 ...

  3. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  4. 【POJ 1850】 Code

    [POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az ...

  5. 【codeforces 438D】The Child and Sequence

    [原题题面]传送门 [大致题意] 给定一个长度为n的非负整数序列a,你需要支持以下操作: 1:给定l,r,输出a[l]+a[l+1]+…+a[r]. 2:给定l,r,x,将a[l],a[l+1],…, ...

  6. 【codeforces 242E】XOR on Segment

    [原题题面]传送门 [题面翻译]传送门 [解题思路] 操作涉及到区间求和和区间异或,考虑到异或操作,我们对每个数二进制分解. 把每一位单独提出来做,异或要么取反要么变为不变,对于每一位建一颗线段树,那 ...

  7. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  8. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  9. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

随机推荐

  1. ORACLE10g R2【RAC+ASM→单实例FS】

    ORACLE10g R2[RAC+ASM→单实例FS] 10g R2 RAC+ASMà单实例FS的DG,建议禁用OMF. 本演示案例所用环境:   primary standby OS Hostnam ...

  2. hibernate 注解配置<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/X

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. 怎样让IE支持自己定义协议

    浏览QQ空间的时候发现,仅仅要在IE地址中输入象一下这样的形式的地址. tencent://Message/?Uin=251464630&websiteName=qzone.qq.com&am ...

  4. js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言

    js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言 一.总结 一句话总结:实现按下组合键提交留言是通过给input加keydown事件,判断按键的键码来实现的. 1.如 ...

  5. POJ 1932 XYZZY (ZOJ 1935)SPFA+floyd

    http://poj.org/problem?id=1932 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1935 题目大 ...

  6. 账号被盗!请勿在CSDN,回复不论什么消息。

    账号被盗!请勿在CSDN,回复不论什么消息.

  7. APK瘦身记,怎样实现高达53%的压缩效果

    作者:非戈@阿里移动安全,很多其它技术干货.请訪问阿里聚安全博客 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式.关于这个话题事实上是一个老生常谈的题目.不论是公司内部.还是外 ...

  8. log4cxx入门篇

    log4cxx入门篇     先看官网:http://logging.apache.org/log4cxx/index.html 转载自:http://wenku.baidu.com/view/d88 ...

  9. 【跟我一起学Unity3D】代码中分割图片而且载入帧序列动画

    在Cocos2dx中.对大图的处理已经封装好了一套自己的API,可是在Unity3D中貌似没有类似的API(好吧,实际上是有的,并且功能更强大),或者说我没找到. 只是这也在情理之中,毕竟Unity3 ...

  10. js进阶 12-4 jquery键盘事件如何使用

    js进阶 12-4 jquery键盘事件如何使用 一.总结 一句话总结:键盘和鼠标都是外设输入设备,所以函数很像,所以使用就像鼠标事件click一样 1.jquery键盘事件有哪三个? 1(up和do ...