解题报告: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题时看到题目情况非常 ...
随机推荐
- 自定义一个JdbcTemplate(增删改数据库中表记录)
需求: 自定义一个JdbcTemplate模板,实现增删改数据库中表记录的功能 1 package demo03; 2 3 import utils.JDBC_DBCP_Utils; 4 5 impo ...
- .NetCore2.0引用DLL报System.InvalidOperationException: Can not find compilation library location for package 'XXX'
.NET CORE 2.0 MVC项目引用类库出现:System.InvalidOperationException: Can not find compilation library locatio ...
- c++练习267题 火柴棒等式
*267题 原题传送门:http://oj.tfls.net/p/267 题解: #include<bits/stdc++.h>using namespace std;int c,m;in ...
- vue实现图片上传且实时预览
<div class="up-img"> <div class="imgList"> <ul> <li v-for=& ...
- Qt 3D示例——cube
Qt 3D官方示例 cube的3D演示,一个纯C++的项目.虽然QML示例比较炫,但是要深入理解还是得从C++例子入手. 从MainWidget.show入口.一步步可以跟踪到initializeGL ...
- loader的原理
loader的基本原理 帮助浏览器将不同类型的文件资源转化为浏览器可识别的资源 分类 前置loader: pre 普通loader: normal 内联loader': inline 后置loader ...
- 【c#】csharp_learn
csharp learn JSON C#解析JSON字符串总结 https://www.cnblogs.com/nc923/p/11418583.html c#解析json字符串处理(最清晰易懂的方法 ...
- Linux系统Shell脚本第一章:Shell脚本基础及时间同步
目录 一.Shell脚本基础 1.Shell作用 2.什么是Shell脚本及处理逻辑 3.shell脚本基本格式 4. shell脚本执行方式 5.实操演示 二.Shell脚本中的变量 1.变量的作用 ...
- redis 0: "AUTH <password> called without any password configured for the def
运行项目的时候,报redis 0: "AUTH <password> called without any password configured for the def 原因: ...
- idea字体的大小设置
idea字体大小设置 两个方法,滚轮.固定大小设置 固定字体大小 file--settings--editor--font--size 修改为需要大小字号,例如20,点击ok 菜单栏的大小设置也差不多 ...