当前位置: 首页 > news >正文

题解:P11894 「LAOI-9」Update

看到题目是区间修改,容易想到差分。但是题目要求对于每个 $a_i \leftarrow a_i + \lfloor \log_2 a_i \rfloor $。所以计算答案时要运用数学方法,对于当前这个 $a_i $,令 \(\lfloor \log_2 b_i\rfloor=\lfloor\log_2 a_i\rfloor+1\),计算 \(a_i\)\(b_i\) 之间的差值再除以 \(\lfloor\log_2 a_i\rfloor\),如果差值要小于等于当前剩余的计算次数,就可以直接跳;否则就拿答案再加上剩余次数乘上 \(\lfloor\log_2 a_i\rfloor\)。时间复杂度是线性对数。

#include<bits/stdc++.h>
using namespace std;
const int N=1010101;
int n,m,a[N],sum[N],num,cnt[N];
int main(){scanf("%d%d",&n,&m);cnt[1]=1;for(int i=2;i<=25;i++)cnt[i]=cnt[i-1]*2;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++){int l,r;scanf("%d%d",&l,&r);sum[l]++,sum[r+1]--;}for(int i=1;i<=n;i++){num+=sum[i];int ans=a[i],k;for(int j=1;j<=25;j++){if(cnt[j]>a[i]){k=j-1;break;}}for(int j=1;j<=num;){int w=log2(ans);int v=(cnt[k+1]-ans);if(w==0)break;else v=(v+w-1)/w;if(v<=num-j+1){j+=v;ans+=w*v;k++;}else{ans+=w*(num-j+1);j=num+1;}}printf("%d ",ans);}return 0;
}
http://www.wxhsa.cn/company.asp?id=601

相关文章:

  • 题解:P2012 拯救世界2
  • 今日随笔
  • 一键安装小雅Alist
  • 题解:AT_abc394_c [ABC394C] Debug
  • Lumion Pro 12.0 下载安装教程包含安装包下载、安装、激活超详细图文步骤
  • 题解:CF348C Subset Sums
  • 题解:CF351B Jeff and Furik
  • 题解:CF2118D1 Red Light, Green Light (Easy version)
  • Project Euler题解思路导航(私人)
  • 27届春招备战一轮复习--第五期
  • 阅读方式
  • Audition 2025(AU2025)超详细直装版下载安装教程保姆级
  • pg 解析select语句的返回值
  • 长乐一中 CSP-S 2025 提高级模拟赛 Day2
  • 费用流
  • [豪の学习笔记] 软考中级备考 基础复习#6
  • RAG
  • 手撕深度学习:矩阵求导链式法则与矩阵乘法反向传播公式,深度学习进阶必备!
  • CF *3200
  • 分享我在阿贝云使用免费虚拟主机的真实体验!
  • 软件测试工程师的职业天花板在哪里?如何突破?
  • 02020213 .NET Core重难点知识13-配置日志邮件服务案例、DI读取、DI与扩展方法、VS配置项目环境变量
  • GJOI 模拟赛题记录声明
  • Ubuntu 卸载 Firefox 浏览器
  • 录无法修改OneDrive文件的解决方法
  • 量子机器学习入门:三种数据编码方法对比与应用
  • 向量数据库
  • UGNX2506下载和安装教程包含激活教程步骤(超详细保姆级图文UGNX安装步骤)
  • ansible剧本
  • uniapp插件开发