简要题意

给你一个长度为 \(n\) 的正整数序列 \(a\),有 \(m\) 个询问,每一个询问给出一个区间 \([l,r]\)。定义函数 \(f(x)=\lfloor\log_{2}(x)+1\rfloor\)。将 \([l,r]\) 的所有元素 \(a_p\) 修改为 \(f(a_p)\)。然后输出序列 \(a\) 的全局和。

对于 \(100\%\) 的数据,\(1 \leq n,m \le 10^5,1 \leq a_i \leq 10^9\)。

思路

前置知识:线段树。

这一道题是无标记区间修改线段树(我自己取得名字)的模板题。

这道题如果使用普通的线段树区间修改(打标记法),无论是标记下传还是标记永久化,都有一个问题:如何实现区间更新?也就是说知道 \(\sum_{i=l}^{r}{a_i}\),如何求 \(\sum_{i=l}^{r}{f(a_i)}\)?

这不是不好求,是不能求。

那我们考虑回归暴力。暴力思路很简单,在线段树上找到 \([l,r]\) 的所有元素,一一单点更新即可。

接下来见证奇迹的时刻:首先,易证当 \(x=1\) 或 \(x=2\) 时,\(f(x)=x\)。

那我们只需要再维护一个区间最大值,如果线段树遍历到的区间最大值 \(\leq 2\),那么直接不用更新了,返回。

这样子似乎复杂度没变?不不不,复杂度已经变成了 \(O(\alpha(a_i)n)\)!

这里给出简单证明过程:首先,\(f(i)\approx \log_{2}(i)\),也就是说,单次 \(f(i)\) 时缩减到了 \(\log(i)\) 级。

所以如果令 \(x\) 递归 \(k(x)\) 到 \(1\)。我们发现 \(k(x)\) 不太好求,于是我们反过来知道 \(x\) 求 \(k(x)\):

\[\underbrace{2^{2^{2^\cdots}}}_{k(x)}=x
\]

下面我们把上式简写为 \(2@k(x)=x\)。

自然想到阿克曼函数 \(A(2,k(x))=2@k(x)=x\)。然后 \(k(x)\) 就是和 \(\alpha(x)\) 同阶了。

均摊时间复杂度分析:由于每一个元素最多被单点修改 \(\alpha(10^9)\approx 3\) 次。所以均摊时间复杂度是 \(O(3n)\)。

这就是无标记区间修改线段树。课后习题还有几道无标记区间修改线段树的题,供大家练习。

课后习题:

代码

#include <bits/stdc++.h>
#define int long long
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
using namespace std; int n,m;
const int N = 1e5+5;
struct node{
int maxt,sumt;
} t[N<<2]; inline void pushup(int i){
t[i].maxt=max(t[ls].maxt,t[rs].maxt);
t[i].sumt=t[ls].sumt+t[rs].sumt;
} void build(int i,int l,int r){
if(l==r){
cin>>t[i].maxt;
t[i].sumt=t[i].maxt;
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(i);
} inline int magic(int x){
return floor(log(x)/log(2)+1);
} void update(int ql,int qr,int i,int l,int r){
if(t[i].maxt<=2){
return;
}
if(l==r){
t[i].sumt=t[i].maxt=magic(t[i].sumt);
return;
}
if(ql<=mid){
update(ql,qr,ls,l,mid);
}
if(qr>mid){
update(ql,qr,rs,mid+1,r);
}
pushup(i);
} int query(int ql,int qr,int i,int l,int r){
if(ql<=l&&r<=qr){
return t[i].sumt;
}
int ret=0;
if(ql<=mid){
ret += query(ql,qr,ls,l,mid);
}
if(qr>mid){
ret += query(ql,qr,rs,mid+1,r);
}
return ret;
} signed main(){
cin>>n>>m;
build(1,1,n);
while(m--){
int l,r;
cin>>l>>r;
update(l,r,1,1,n);
cout<<query(1,n,1,1,n)<<'\n';
}
return 0;
}

(听说有人抄我的交题解,我劝你善良)

P8618 [蓝桥杯 2014 国 B] Log 大侠的更多相关文章

  1. 2014年第五届蓝桥杯国赛 Log大侠(区间合并+Java递归效率分析)

    1678: Log大侠 java 时间限制: 2 Sec  内存限制: 256 MB提交: 20  解决: 1 题目描述     atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称L ...

  2. 蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举

    蓝桥杯 枚举 奇怪的分式 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1 ...

  3. [蓝桥杯]2014蓝桥省赛B组题目及详解

    /*——————————————————————————————————————————————————————————— [结果填空题]T1 题目:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小 ...

  4. 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归

    标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次, ...

  5. 蓝桥杯 2014本科C++ B组 六角填数 枚举排列

    标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填 ...

  6. 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索

    历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角 ...

  7. 平方十位数(蓝桥杯第八届国赛真题 JAVA-B组)

    思路:从大到小枚举,判断其平方是否不重复 答案:9814072356 //水题 标题:平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平 ...

  8. 【蓝桥杯真题】地宫取宝(搜索->记忆化搜索详解)

    链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...

  9. 蓝桥杯Log大侠(线段树单点区间更新)

    标题:Log大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力... 变换的规则是: ...

  10. java实现第五届蓝桥杯LOG大侠

    LOG大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力- 变换的规则是: 对其某个 ...

随机推荐

  1. C++ 函数重载解析策略

    参考<C++ Primer Plus>(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社.C++ 使用重载解析策略来决定为函数调用使用哪一个函数定义.重载解 ...

  2. Silky微服务框架之服务引擎

    构建服务引擎 在注册Silky微服务应用一节中,我们了解到在ConfigureServices阶段,通过IServiceCollection的扩展方法AddSilkyServices<T> ...

  3. 关于Dockerfile的写法

    Dockerfile是用来自定义构建镜像的文件. Dockerfile: FROM nginx RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/ht ...

  4. MongoDB数据库新手入门

    windows安装mongodb 5.0.2 官网下载msi文件 自定义安装到 d:/apptoools/mongodb/ 不要勾选mongodb compass 报错:verify that you ...

  5. Vue 实现小小记事本

    1.实现效果 用户输入后按回车,输入的内容自动保存,下方会显示记录的条数,鼠标移动到文字所在div上,会显示删除按钮,点击按钮,相应记录会被删除,下方的记录条数会相应变化,点击clear,所有记录会被 ...

  6. Codeforces Round #802 (Div. 2)C. Helping the Nature(差分)

    题目链接 题目大意: 给你一个有n个元素的数组a,你可以通过一下三种操作使数组的每一个值都为0: 选择一个下标i,然后让a[1],a[2]....a[ i ] 都减一; 选择一个下标i,然后让a[i] ...

  7. 「浙江理工大学ACM入队200题系列」问题 F: 零基础学C/C++39——求方程的解

    本题是浙江理工大学ACM入队200题第四套中的F题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...

  8. 还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB·洞见#7

    数据库用户通常依赖隔离级别来确保数据一致性,但很多数据库却并未达到其所表明的级别.主要原因是:一方面,数据库开发者对各个级别的理解有细微差异:另一方面,实现层面没有达到理论上的要求. 用户在使用或开发 ...

  9. springboot中使用mybatis_plus逆向工程

    创建springboot项目,选择图片中所示依赖 mybatis-plus生成的依赖 <!-- mybatis_plus --> <dependency> <groupI ...

  10. SpringCloud(十一)- 秒杀 抢购

    1.流程图 1.1 数据预热 1.2 抢购 1.3 生成订单 (发送订单消息) 1.4 订单入库 (监听 消费订单消息) 1.5 查看订单状态 1.6 支付 (获取支付链接 ) 1.7 支付成功 微信 ...