codeforece 768 B. Code For 1
来源:互联网 发布:南京雨花台区网络问政 编辑:程序博客网 时间:2024/05/01 19:39
Jon fought bravely to rescue the wildlings who were attacked by the white-walkers at Hardhome. On his arrival, Sam tells him that he wants to go to Oldtown to train at the Citadel to become a maester, so he can return and take the deceased Aemon's place as maester of Castle Black. Jon agrees to Sam's proposal and Sam sets off his journey to the Citadel. However becoming a trainee at the Citadel is not a cakewalk and hence the maesters at the Citadel gave Sam a problem to test his eligibility.
Initially Sam has a list with a single element n. Then he has to perform certain operations on this list. In each operation Sam must remove any element x, such that x > 1, from the list and insert at the same position , , sequentially. He must continue with these operations until all the elements in the list are either 0 or 1.
Now the masters want the total number of 1s in the range l to r (1-indexed). Sam wants to become a maester but unfortunately he cannot solve this problem. Can you help Sam to pass the eligibility test?
The first line contains three integers n, l, r (0 ≤ n < 250, 0 ≤ r - l ≤ 105, r ≥ 1, l ≥ 1) – initial element and the range l to r.
It is guaranteed that r is not greater than the length of the final list.
Output the total number of 1s in the range l to r in the final sequence.
7 2 5
4
10 3 10
5
Consider first example:
Elements on positions from 2-nd to 5-th in list is [1, 1, 1, 1]. The number of ones is 4.
For the second example:
Elements on positions from 3-rd to 10-th in list is [1, 1, 1, 0, 1, 0, 1, 0]. The number of ones is 5.
///关键用好对称轴位置 递归即可
粗心卡了半天T_T
#include <algorithm>#include <iostream>#include <cstring>#include <iomanip>#include <string>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>using namespace std;#define For(i,a,b) for(i=a;i<=b;i++)#define _For(i,a,b) for(i=b;i>=a;i--)#define Out(x) cout<<x<<endl#define Outdouble(x,a) cout<<fixed<<setprecision(a)<<1.0*x<<endl#define pf prllf#define sf scanf#define mset(arr,num) memset(arr,num,sizeof(arr))#define ll long longconst ll inf = 1e12+10; ///#define ok std::ios::sync_with_stdio(0)#pragma comment(linker, "/STACK:102400000,102400000")// #define debug#if defined (debug)---check---#endif/// ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ////* 10 5 0 5 212 0 212101 1 101 0 101 1 101 可以观察到规律 关键记录对称轴位置*/ll cnt;ll num[1010];ll op(ll key){ if(key == 0) { return 0; } if(key == 1) { return 1; } ll ans = 1; ll j = cnt; ll len = 1; while(len*2+1 <= key) { len=len*2+1; ans=ans*2+num[j]; ///加上对称轴元素 j--; } ///关键 len不可能到达对称轴位置 一直是差一 if(len == key) return ans; ///正好计算完毕 else if(key - len == 1) return ans + num[j]; ///如果实际长度与询问差1 那么加上对称轴位置的数 else return (ans + num[j] +op(key % (len+1))); ///否则加上对称轴元素 取余 从头计算}int main(){ ll i,l,r; ll n,ans = 0; while(cin>>n>>l>>r) { cnt = 0; if(n == 0) { cout<<0<<endl; continue ; } else if(n == 1) { cout<<1<<endl; continue; } else { while(n>1) { cnt++; ///1~ans num[cnt] = n%2; n=n>>1; } cout<<op(r) - op(l-1)<<endl; } } return 0;}/**903316762502 354723010040 354723105411*/
- codeforece 768 B. Code For 1
- B. Code For 1
- B. Code For 1
- codeforces 768 B Code For 1 (数学)
- Codeforces 768B Code For 1
- 【codeforces 768B】Code For 1
- Codeforces 768B Code For 1[DFS]
- [二分] cf 768B Code For 1
- Codeforces 768B Code for 1 【分治】
- Codeforces 768B Code For 1
- 768B Code For 1 [二分]
- CodeForces 768B Code For 1
- codeforces-768B Code for 1
- cf B. Code For 1
- Codeforces 768B Code For 1 二分+区间查询
- Codeforces 768B Code For 1 线段树思想
- 【Codeforces 768 B Code For 1】+ 简单线段树
- Codeforces 768B Code For 1 (简化版线段树)
- makefile文件的编写,目标文件作为目标是否多余?
- android studio中断开SVN连接,并彻底清理项目中的.svn文件
- 大乐透 不明白
- 【洛谷 1219】八皇后
- java.lang.NullPointerException:Attempt to invoke virtual method xxx on a null object reference
- codeforece 768 B. Code For 1
- 系统指标积累 TBD
- 查询斐波那契数列
- 【算法】程序猿不写代码是不对的20
- ERP项目管理 的关键控制点
- 基于canvas的二维码邀请函生成插件
- 洛谷 P1135 奇怪的电梯
- Spring mvc 拦截器 interceptor 配置
- JavaScript入门篇--常用互动方法