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\)是前项数:

\[\lfloor\frac{x+2^{h-i-1}}{2^{h-i}}\rfloor
\]

所以最终要求的前缀和

\[f(x) = \sum\limits_{i=0}^{h-1}v_i\cdot\lfloor\frac{x+2^{h-i-1}}{2^{h-i}}\rfloor
\]
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的更多相关文章

  1. Codeforces 768B - Code For 1(分治思想)

    768B - Code For 1 思路:类似于线段树的区间查询. 代码: #include<bits/stdc++.h> using namespace std; #define ll ...

  2. 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. 寒假训练3解题报告 CodeForces #148

    CodeForces 148B 一道简单模拟,判断龙能够抓到公主几次,如果公主和龙同时到达公主的城堡,不算龙抓住她,因为路程除以速度可能会产生浮点数,所以这里考虑一下精度问题 #include < ...

  4. cf1189解题报告

    cf1189div2解题报告 codeforces A 答案要不是一串要不就是去掉最后一个字母的两串 #include <bits/stdc++.h> #define ll long lo ...

  5. Codeforces Round 665 赛后解题报告(暂A-D)

    Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...

  6. Codeforces Round 662 赛后解题报告(A-E2)

    Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

  7. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

  8. CodeForces 构造题专项解题报告

    CodeForces 构造题专项解题报告 \(\newcommand \m \mathbf\)\(\newcommand \oper \operatorname\) \(\text{By DaiRui ...

  9. codeforces 476C.Dreamoon and Sums 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...

  10. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

随机推荐

  1. hdfs file system shell的简单使用

    目录 1.背景 2.hdfs file system shell命令有哪些 3.确定shell操作的是哪个文件系统 4.本地准备如下文件 5.hdfs file system shell 5.1 mk ...

  2. mysql8.0.30主从配置

    安装包下载地址: https://downloads.mysql.com/archives/community/ 1. 解压介质包: # tar xf mysql-8.0.30-linux-glibc ...

  3. Vue 超长列表渲染性能优化

    参考:https://juejin.cn/post/6979865534166728711#heading-3 组件懒加载参考:https://github.com/xunleif2e/vue-laz ...

  4. Vulnhub:katana靶机

    kali:192.168.111.111 靶机:192.168.111.194 信息收集 端口扫描 目录爆破发现80端口/ebook/database目录下的readme.txt.txt文件提示用户密 ...

  5. 隐藏来源 禁用Referrer 的方法

    原文链接: https://www.cnblogs.com/duanweishi/p/16490197.html https://blog.csdn.net/qq996150938/article/d ...

  6. 杭电oj 进制转换

    Problem Description 输入一个十进制数N,将它转换成R进制数输出.   Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=1 ...

  7. allure+testng遇到的一些问题

    java+testng+allure 听说allure报告,"很好看",决定引入. 首先看allure官网,需要在pom.xml中引入包 文档:https://docs.qamet ...

  8. vue项目打包后的文件如何在本地访问

    你是不是一直存在个困惑?vue项目build出来的dist文件夹下index.html直接点开始控制台一顿报错.今天咱就给他治服. 解决方案就是本地启动一个node服务.详细步骤如下: 创建项目 np ...

  9. VS2015使用gitee插件进行协同开发

    众所周知,软件项目壮大后是需要安装git,svn这些协同软件来进行合作开发的.最近接了一位电气工程师的活,让我帮忙开发一套上位机,这位工程师年数已高,仍热心学习编程每日至深夜.于是乎,我们商讨之下便决 ...

  10. java HashMap 原理

    jdk1.7 和 1.8 大致相同但还是有区别,主要是数据结构的区别,1.7 为数组+链表:1.8 为数组+链表+红黑树 关键知识点 加载因子:装填因子,目的是何时对 map 进行扩容,默认是 0.7 ...