【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子列的个数; 然后让你输出 ...
随机推荐
- 韦东山网课https://edu.csdn.net/course/play/207/1117
接口讲解https://edu.csdn.net/course/play/207/1117
- [置顶]
WebService学习总结(4)——第三方webService服务调用
互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...
- 不在JPA 的 persistence.xml 文件中配置Entity class的解决办法
在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,2种方法可以解决此问题: 这2种方式都可以实现不用在persiste ...
- 对于学习apache软件基金会顶级项目源码的一点思路(转)
ASF的开源项目,为软件行业贡献了太多好的产品和软件思维.学习ASF的项目源码能很大的提升自身的能力.程序运行在服务器上的流程:执行启动脚本(start.sh) -> 指向程序的主方法 -> ...
- 深入并发AQS二
AQS须要解决下面几个问题: 1.锁状态,怎样保证并发情况下可以安全的更新? 2.当前线程不能获取锁时,放在哪里? AQS是放在一个队列其中 3.怎样提高效率? AQS的主要职责是当获取不到锁时.将线 ...
- JS数据类型的转换规则
数据类型转换的规则 1 如果只有一个值,判断这个值是真还是假,遵循只有0,NaN,'',null,undefined这五个是假的,其余的都是真 2 如果是两个值比较是否相等,遵循以下规则: ![]-& ...
- Java Scheduler ScheduledExecutorService ScheduledThreadPoolExecutor Example(ScheduledThreadPoolExecutor例子——了解如何创建一个周期任务)
Welcome to the Java Scheduler Example. Today we will look into ScheduledExecutorService and it's imp ...
- MySql 中的setAutoCommit方法
引言 setAutoCommit方法用一句话说就是用来保持事务完整性.一个系统的更新操作可能涉及多张表,这个时候,就须要用多个Sql语句来实现,实际上我认为这个东西就是用来实现事务的. 当我们进行多条 ...
- mysql8 mongodb4 增删改查 性能对比,2019 最专业对比,nosql 真的比 sql 性能强很多?
原文:mysql8 mongodb4 增删改查 性能对比,2019 最专业对比,nosql 真的比 sql 性能强很多? 版权所有:http://www.fengyunxiao.cn 近几年看了很多关 ...
- Nginx+Tomcat+Memcached实现会话保持(MSM)
会话保持的三种方式 Session sticky会话绑定:通过在前端调度器的配置中实现统一session发送至同一后发端服务器 Session cluster会话集群:通过配置Tomcat保持所有To ...