【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子列的个数; 然后让你输出 ...
随机推荐
- 1.11 Python基础知识 - 序列:元组
元组(tuple)是一组有序系列,元组和列表是否相似,但是元组是不可变的对象,不能修改.添加或删除元组中的元素,但可以访问元组中的元素 元组的定义: 元组采用圆括号中用逗号分隔的元素 元组的基本操作和 ...
- 知无涯者(The Man Who Knew Infinity)
1913年的1月16号在剑桥大学的三一学院那里,著名的数学家哈代教授收到了一封信,信的开头是这种: "尊敬的先生.仅自我介绍例如以下,我是马德拉斯港务信托处的一个职员,年薪唯独20英镑.23 ...
- noi25 最长最短单词(为什么会出现运行时错误)
noi25 最长最短单词(为什么会出现运行时错误) 一.总结 一句话总结:比如除以零,数组越界,指针越界,使用已经释放的空间,数组开得太大,超出了栈的范围,造成栈溢出 1.c++报runtime er ...
- android String 类型转换成UTF-8格式
在android开发中,有时候会遇到汉字乱码的问题,在这个时候,吧String串加一个编码格式转换,转换成UTF-8的格式就可以了 public static String toUtf8(String ...
- JS中的发布订阅模式
一. 你是如何理解发布订阅模式的 JS中的设计模式: 单例模式:处理业务逻辑 构造原型模式:封装类库,组件,框架,插件等 类库:jQuery 只是提供了一些常用的方法,可以应用到任何的项目中,不具备业 ...
- UVA 488 - Triangle Wave 水~
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 【Codeforces Round #442 (Div. 2) C】Slava and tanks
[链接] 我是链接,点我呀:) [题意] 有n个位置,每个位置都可能有不定数量的tank; 你每次可以选择一个位置投掷炸弹. 并且,这个位置上的所有tank都会受到你的攻击. 并且失去一点体力. 然后 ...
- [Angular2 Router] Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?
In this tutorial we are going to learn how we can can configure redirects in the angular 2 router co ...
- SoC的Testbench中的简易bus_monitor(加入print函数)
SoC的Testbench中的简易bus_monitor(加入print函数) 主要思路 向固定地址写信息 使用工具链将C写的print/printf函数编译成hex文件 在testbench中创建b ...
- C#判断操作系统类型
操作系统 PlatformID 主版本号 副版本号 Windows95 1 4 0 Windows98 1 4 10 WindowsMe 1 4 90 WindowsN ...