【codeforces 768B】Code For 1
【题目链接】: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为止;
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 100;
LL n,l,r,a[N],siz[N],cnt1[N],total;
LL sz[N];
int num = 0;
void fix(LL x)
{
if (x==2 || x==3)
{
num++;
siz[num] = 3;
sz[num] = x;
if (x==2)
cnt1[num]=2;
else
cnt1[num]=3;
}
else
{
fix(x>>1);
num++;
sz[num] = x;
siz[num] = siz[num-1]*2+1;
cnt1[num] = cnt1[num-1]*2+(x&1);
}
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
rel(n),rel(l),rel(r);
//n==0 || n==1?
if (n==0)
{
puts("0");
return 0;
}
if (n==1)
{
puts("1");
return 0;
}
fix(n);
total = siz[num];
//cnt右==size-(r+1)+1
LL cnty = total-(r+1)+1;
LL tempy = 0;
if (cnty>0)
{
if (cnty==1)
tempy++;
else
if (cnty==2)
{
if (cnt1[1]==3) tempy+=2;
else
tempy+=1;
}
else
{
while (cnty>=3)
{
rep1(i,1,num)
if (cnty<=siz[i])
{
if (cnty==siz[i])
{
cnty=0;
tempy+=cnt1[i];
break;
}
cnty-=siz[i-1];
tempy+=cnt1[i-1];
if (cnty>0)
{
cnty--;
tempy+=(sz[i]&1);
}
break;
}
}
if (cnty==1)
tempy++;
else
if (cnty==2)
{
if (cnt1[1]==3) tempy+=2;
else
tempy+=1;
}
}
}
//cnt左==l-1
LL cntz = l-1;
LL tempz = 0;
if (cntz>0)
{
if (cntz==1)
tempz++;
else
if (cntz==2)
{
if (cnt1[1]==3) tempz+=2;
else
tempz+=1;
}
else
{
while (cntz>=3)
{
rep1(i,1,num)
if (cntz<=siz[i])
{
if (cntz==siz[i])
{
cntz=0;
tempz+=cnt1[i];
break;
}
cntz-=siz[i-1];
tempz+=cnt1[i-1];
if (cntz>0)
{
cntz--;
tempz+=(sz[i]&1);
}
break;
}
}
if (cntz==1)
tempz++;
else
if (cntz==2)
{
if (cnt1[1]==3) tempz+=2;
else
tempz+=1;
}
}
}
LL tot = cnt1[num];
LL ans = tot-tempz-tempy;
cout << ans <<endl;
return 0;
}
【codeforces 768B】Code For 1的更多相关文章
- 【codeforces 765B】Code obfuscation
[题目链接]:http://codeforces.com/contest/765/problem/B [题意] 让你把每个变量都依次替换成a,b,c,-.d这些字母; 且要按顺序先用a再用b-.c.d ...
- 【codeforces 799B】T-shirt buying
[题目链接]:http://codeforces.com/contest/799/problem/B [题意] 告诉你每个人喜欢的衣服的颜色; 然后告诉你每件衣服的正面和背面的颜色以及它的价格; 只要 ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【POJ 1850】 Code
[POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az ...
- 【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],…, ...
- 【codeforces 242E】XOR on Segment
[原题题面]传送门 [题面翻译]传送门 [解题思路] 操作涉及到区间求和和区间异或,考虑到异或操作,我们对每个数二进制分解. 把每一位单独提出来做,异或要么取反要么变为不变,对于每一位建一颗线段树,那 ...
- 【codeforces 707E】Garlands
[题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...
- 【codeforces 707C】Pythagorean Triples
[题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...
- 【codeforces 709D】Recover the String
[题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...
随机推荐
- TTL和RS232之间的详细对比
[背景] 之前就听过TTL,一直没搞懂其和RS232的区别. 最近,打算去买个USB转RS232的芯片,结果找到此产品: 六合一多功能USB转UART串口模块CP2102 usb TTL485 232 ...
- import 与export详解
ES6 1.export default 其他模块加载该模块时,import命令可以为该匿名函数指定任意名字. 如: import Vue from 'vue' vue里面的第三方模块都是用了这个 使 ...
- amazeui学习笔记--css(布局相关2)--等分网格 AVG Grid
amazeui学习笔记--css(布局相关2)--等分网格 AVG Grid 一.总结 1.与grid区别:网格中:am-g + am-u-xx-n 等分网格中只有一个: am-avg-sm-4(在u ...
- Kaggle实战分类问题2
Kaggle实战之二分类问题 0. 前言 1. MNIST 数据集 2. 二分类器 3. 效果评测 4. 多分类器与误差分析 5. Kaggle 实战 0. 前言 “尽管新技术新算法层出不穷,但是掌握 ...
- loadrunner--分析图合并
一.分析图合并原理 选择view->merge graphs,弹出如图1所示对话框 图1(设置合并图) 1.选择要合并的图.选择一个要与当前活动图合并的图,注意这里只能选择X轴度量单位相同的图. ...
- php课程 8-30 实现验证码验证的难点是什么
php课程 8-30 实现验证码验证的难点是什么 一.总结 一句话总结:session技术实现验证码传递. 1.生成验证码的那个网页(php文件)中的验证码怎么搁到别的网页中去? 直接在img的src ...
- 8.5 Android灯光系统_源码分析_通知灯
参考文章(应用程序举例)how to use the LED with Android phonehttp://androidblogger.blogspot.jp/2009/09/tutorial- ...
- 取消UITableViewCell的背景色
//无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色,也就是系统默认的颜色 cell.selectionStyle = ...
- Android中各种drawable的使用
转载请说明出处.本文来自Android菜鸟:http://blog.csdn.net/android_cai_niao/article/details/46854767 QQ:2717521606 ...
- 如何使stm32程序更好移植, 结构体相当于define
原创:转载请标注引用地址 如何定义 led1对应于PA8 呢 :对于我一开始学习的方法:: #include "main.h" #define led1 GPIO_Pi ...