【题目链接】: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的更多相关文章

  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. document.write的注意点

    如果给button点击事件添加document.write会消除页面所有元素,包括button按钮 <!DOCTYPE html> <html> <head> &l ...

  2. 洛谷 P1211 [USACO1.3]牛式 Prime Cryptarithm

    P1211 [USACO1.3]牛式 Prime Cryptarithm 题目描述 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. *** x ** ...

  3. Dcloud课程4 如何进行APP接口开发

    Dcloud课程4 如何进行APP接口开发 一.总结 一句话总结:通过json或者xml. 1.APP如何进行通信? 通过在地址上接参数指明传递的数据的类型.而数据传递的类型一般是XML和json. ...

  4. Codeforces Round #100 E. New Year Garland (第二类斯特林数+dp)

    题目链接: http://codeforces.com/problemset/problem/140/E 题意: 圣诞树上挂彩球,要求从上到下挂\(n\)层彩球.已知有\(m\)种颜色的球,球的数量不 ...

  5. Altium Designer如何创建类,如何修改线宽

    如果线宽还是没有改变,就是因为,有一个默认的class,它的规则优先级要高于PWR

  6. HDU 2473 Junk-Mail Filter 并查集删除(FZU 2155盟国)

    http://acm.hdu.edu.cn/showproblem.php?pid=2473 http://acm.fzu.edu.cn/problem.php?pid=2155 题目大意: 编号0~ ...

  7. java三大特性:封装、继承、多态

    Java三大特性之封装   一.定义 封装性指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问. 二.使用封装的好处: 1 ...

  8. MySQL字符编码问题,Incorrect string value

    MySQL上插入汉字时报错例如以下.详细见后面分析. Incorrect string value: '\xD0\xC2\xC8A\xBEW' for column 'ctnr' at row 1 M ...

  9. Maven 使用Eclipse构建Maven的SpringMVC项目

    首先Eclipse需要安装Maven的插件,地址:http://m2eclipse.sonatype.org/sites/m2e. 用MyEclipse安装Maven插件,建出的Maven项目有些问题 ...

  10. Makefile中支持的函数大全

    一.描述 Makefile的函数调用,很像变量的使用,也是以"$"来标识的,其语法如下: $(<function> <arguments> ) 或是 ${& ...