【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子列的个数; 然后让你输出 ...
随机推荐
- bootstrap课程12 滚动监听如何实现(bootstrap方式和自定义方式)
bootstrap课程12 滚动监听如何实现(bootstrap方式和自定义方式) 一.总结 一句话总结:通过监听滚动的高,判断滚动的高是否大于元素距离顶端的距离 1.如何知道屏幕滚动的高? st=$ ...
- Spark SQL概念学习系列之Spark SQL基本原理
Spark SQL基本原理 1.Spark SQL模块划分 2.Spark SQL架构--catalyst设计图 3.Spark SQL运行架构 4.Hive兼容性 1.Spark SQL模块划分 S ...
- web前端背景介绍
Internet:是一个全球性的计算机互联网络,中文名称“因特网”.“国际互联网”.“网际网”等等: Internet提供的服务:http.ftp.Telnet.email.www.bbs等等: 基本 ...
- 【习题 6-10 UVA - 246】10-20-30
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 发牌的那个牌堆用一个deque,7个牌堆用vector来模拟. 然后按照题意模拟就好. 不难. [代码] /* 1.Shoud it ...
- h5做app和原生app有什么区别?
h5做app和原生app有什么区别? 一.总结 一句话总结: 二.h5做app和原生app有什么区别? 普通的HTML5技术与原生技术相比,有跨平台.动态.开放.直达二级内容页面等特点,但却在性能.工 ...
- amazeui学习笔记--css(布局相关1)--网格Grid
amazeui学习笔记--css(布局相关1)--网格Grid 一.总结 基本使用 1.div+class布局:amaze里面采取的就是div+class的布局方式 <div class=&q ...
- amazeui学习笔记--css(基本样式3)--文字排版Typography
amazeui学习笔记--css(基本样式3)--文字排版Typography 一.总结 1.字体:amaze默认非 衬线字体(sans-serif) 2.引用块blockquote和定义列表:引用块 ...
- 【Codeforces Round #433 (Div. 1) B】Jury Meeting
[链接]h在这里写链接 [题意] 有n个人,它们都要在某一时刻开始,全都到达0位置,然后维持最少k个时间单位,然后再全都回到原来的位置; 第i个人初始的位置是i. 且一共有m班航班. 每一班航班,要么 ...
- JavaFX2 - 文本可复制的Label
背景介绍 我的公司和我个人一直都使用JavaFX2来编写client应用程序,同一时候也作为Applet在浏览器中执行. 我们的客户以前拿我们的产品和网页对照,然后向我们提过两个需求: (1) 希望界 ...
- php 获取隔日日期
php获取日期时间 <?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d&qu ...