解题报告:Codeforces 768B Code For 1
Codeforces 768B Code For 1
题义
有一个序列,刚开始,只有1个数\(n\),接着按照以下规则变化找到序列中任意一个\(>1\)的数\(p\),将他变为 \(\lfloor\frac{p}{2}\rfloor\), \(p \% 2\), \(\lfloor\frac{p}{2}\rfloor\)。不断进行直到序列中只剩下\(0\)和\(1\)。要问你最后生成的\(01\)序列的区间和。
以\(n=17\)为例:
17
8 1 8
4 0 4 4 0 4
2 0 2 2 0 2 2 0 2 2 0 2
101 101 101 101 101 101 101 101
-------------------------------
1010101010101011101010101010101
俺的思路
观察上面那个树,我们可以发现一些对称性,并且每个\(>1\)的\(p\)生成的中间那个\(p \% 2\)不再变动,保留到最后的序列;\(\lfloor\frac{p}{2}\rfloor\)放在自己的两边,之后继续生成直到变成\(1\)。
我们可以先把每一层的\(p \% 2\)记录下来。最后的\(1\)也记录下来了。
vector<ll> v;
while(n>1){
v.push_back(n%2);
n/=2;
}
v.push_back(n);
后来一想好像根本不用vector,直接位移都可以。
然后大概可以通过一些关系找出每个\(p \% 2\)在生成序列中出现的位置?
下图中的数字\(i\)指代第\(i\)层的\(p \% 2\),也即v的下标,从\(0\)开始。
0
1 1
2 2 2 2
3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
-------------------------------
4342434143424340434243414342434
好像规律也不是很难找,你看\(4\)的周期是\(2\),\(3\)的周期是\(4\),\(2\)的周期是\(8\),\(1\)的周期是\(16\),\(0\)的周期大概是\(32\)?
好像可以求前缀和了叭。我们大概可以算出来每个\(i\)在前\(x\)中出现的次数,
0
1 1
2 2 2 2
3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
-------------------------------
4342434143424340434243414342434
i=4: 112233445566778899aabbccddeeffg
i=3: 0111122223333444455556666777788
i=2: 0001111111122222222333333334444
i=1: 0000000111111111111111122222222
i=0: 0000000000000001111111111111111
然后乘上\(v_i\),最后加起来就可以算到。
前缀和怎么算?
推出来这个东西,\(h\)是树高度,\(i\)是要求和的下标,\(x\)是前项数:
\]
所以最终要求的前缀和
\]
ll f(ll x){
ll s = 0, h = v.size();
wlf(i,0,h-1){
s+=v[i]*((x+(1ll<<(h-i-1)))/(1ll<<(h-i)));
}
return s;
}
然后每次查询来个\(f(r)-f(l-1)\)就是答案。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define wlf(i,a,b) for(ll i=a;i<=b;++i)
#define tbw(i,a,b) for(ll i=a;i>=b;--i)
#define fill0(b) memset(b,0,sizeof(b))
#define fill1(b) memset(b,-1,sizeof(b))
#define fill3f(b) memset(b,0x3f,sizeof(b))
#define nsort(a,n) sort(a+1,a+1+n)
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll MOD = 1e9+7;
const ll N = 1e5+10;
ll n,l,r;
vector<ll> v;
ll f(ll x){
ll s = 0, h = v.size();
wlf(i,0,h-1){
s+=v[i]*((x+(1ll<<(h-i-1)))/(1ll<<(h-i)));
}
return s;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>l>>r;
while(n>1){
v.push_back(n%2);
n/=2;
}
v.push_back(n);
cout<<f(r)-f(l-1)<<endl;
return 0;
}
解题报告:Codeforces 768B Code For 1的更多相关文章
- Codeforces 768B - Code For 1(分治思想)
768B - Code For 1 思路:类似于线段树的区间查询. 代码: #include<bits/stdc++.h> using namespace std; #define ll ...
- Codeforces 768B Code For 1
B. Code For 1 time limit per test:2 seconds memory limit per test:256 megabytes input:standard input ...
- 寒假训练3解题报告 CodeForces #148
CodeForces 148B 一道简单模拟,判断龙能够抓到公主几次,如果公主和龙同时到达公主的城堡,不算龙抓住她,因为路程除以速度可能会产生浮点数,所以这里考虑一下精度问题 #include < ...
- cf1189解题报告
cf1189div2解题报告 codeforces A 答案要不是一串要不就是去掉最后一个字母的两串 #include <bits/stdc++.h> #define ll long lo ...
- Codeforces Round 665 赛后解题报告(暂A-D)
Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...
- Codeforces Round 662 赛后解题报告(A-E2)
Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...
- Codeforces Educational Round 92 赛后解题报告(A-G)
Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...
- CodeForces 构造题专项解题报告
CodeForces 构造题专项解题报告 \(\newcommand \m \mathbf\)\(\newcommand \oper \operatorname\) \(\text{By DaiRui ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
随机推荐
- python编辑excel表格文件的简单方法练习
一.创建一个Excel文件from openpyxl import Workbook #需要用到openpyxl模块来操作Excel文件.openpyxl需要先安装.#实例化对象wb = Workbo ...
- linux 信号 未决信号集和屏蔽信号集
有的地方,将屏蔽又叫阻塞? 在虚拟地址空间中,内核区的PCB中 有两个64位的值(集合),分别表示64个信号的未决状态(未被处理)和屏蔽与否 kill -l 可以查看linux中的所有信号,共64个 ...
- 记录篇-浪潮服务器raid卡
在说raid卡之前,首先,我们要明确,不同的raid卡型号,会有不同的配置方式,但是总体来说是大同小异的 这里举例浪潮机架式服务器经常用到的raid卡型号: PM8204 (其实像3108 ...
- lbaas
目录 - LBaaS v2 - 负载均衡概念 - 服务器池 Pool - 监听器 Listener - L7 转发策略 l7 policy - 负载均衡算法 Algorithms - 健康监测 Mon ...
- JAVA丑数
leetcode题目链接 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数.注意,不是必须有这些素因子,而是必须不包含其他的素因子.例如,前几个数按顺序应该是 1,3,5,7,9,15, ...
- Vue2.0 双向绑定的原理与缺陷?
原理 Object.defineProperty.getter.setter 标准回答 Vue响应式指的是:组件的data发生变化,立刻触发试图的更新 原理:Vue采用数据劫持结合发布者-订阅者模式的 ...
- PaaS和SaaS的区别是什么?
PaaS是Platform-as-a-Service的缩写,意思是"平台即服务" SaaS是Software-as-a-Service的缩写,意思是"软件即服务" ...
- 学习lua-06,异常提示,错误处理
addNum = function(a, b) assert(type(a) == 'string','a必须是一个字符串') assert(type(b) == 'string','b必须是一个字符 ...
- Java中类似c语言的printf
System.out.printf("%4d",x); printf("%4d",x); 保留小数点后两位也可以用%.2f 相对来说很好记了 回车用\n
- TM1621断码液晶驱动IC的原理、驱动代码
TM1621是一个多功能的LCD驱动器,带有蜂鸣器驱动功能.通讯采用四线串行接口 TM1621的难点在于字节序和显存跟屏幕的映射关系上,下面是写寄存器的代码 void Delay_us(uint8_t ...