标题:Log大侠

atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠。

一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力...

变换的规则是: 对其某个子序列的每个整数变为: [log_2 (x) + 1]  其中 [] 表示向下取整,
就是对每个数字求以2为底的对数,然后取下整。
    例如对序列 3 4 2 操作一次后,这个序列会变成 2 3 2。
    
    drd需要知道,每次这样操作后,序列的和是多少。

【输入格式】
第一行两个正整数 n m 。
第二行 n 个数,表示整数序列,都是正数。
接下来 m 行,每行两个数 L R 表示 atm 这次操作的是区间 [L, R],数列序号从1开始。

【输出格式】
输出 m 行,依次表示 atm 每做完一个操作后,整个序列的和。

例如,输入:
3 3
5 6 4
1 2
2 3
1 3

程序应该输出:
10
8
6

【数据范围】
对于 30% 的数据, n, m <= 10^3
对于 100% 的数据, n, m <= 10^5

资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

网上很多题解都是解决前面30%的数据的问题的。至于全部数据,在向别的大佬求教后,我试着写了写,

也是过了样例不知道对不对那种。

思路呢,主要就是会发现一个大于1的正数(这题应该是默认输入数据在Integer范围内的吧),经过5次操作之后,
都会变成一个常数2,以后无论在进行多少次操作都维持在2上不变。至于值为1的正数,无论进行多少次变换操作,
值始终为1。
     所以,我们可以用f数组预处理,f[i][j]表示第i个数变换了j次后的结果,则f[i][0]=arr[i](第i个数),
f[i][j]=[log_2 (f[i][j-1]) + 1]。然后看这个数据范围,应该也是对区间整体操作,直接用add数组表示直接对区间整体变换的次数。然后这道对add数组更新,有点类似线段树中的简单更新操作。查询整个序列的和,则可以加个参数addnum,表示之前该区间所属区间已经整体变换的次数。然后对这个区间实际总体最少变换次数=大区间最少变换次数+当前区间直接最少变换次数(例如,10个数,[1,3]区间add值为2,[1,5]区间add值为1,[1,10]区间add值为1,则[1,3]至少变了2+1+1=4次)。然后呢,如果整体区间最少变换次数值>=5,则区间中元素和为2*区间长度-区间中数值为1的数的
个数。否则,就递归下去到单个元素,根据其变换次数,利用预处理的f数组处理,更新ans。

可能还是比较难理解,结合代码相对会好些,代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.StringTokenizer;class Reader {static BufferedReader reader;static StringTokenizer tokenizer;static void init(InputStream input) {reader = new BufferedReader(new InputStreamReader(input));tokenizer = new StringTokenizer("");}static String next() throws IOException {while (!tokenizer.hasMoreTokens()) {tokenizer = new StringTokenizer(reader.readLine());}return tokenizer.nextToken();}static int nextInt() throws IOException {return Integer.parseInt(next());}
}public class Main {/*** @param args*/static long ans;static int n, m, ql, qr;static int arr[], num1[], add[];static long f[][];private static void init() {f = new long[n + 1][6];int val;for (int i = 1; i <= n; i++) {f[i][0] = arr[i];for (int j = 1; j <= 5; j++) {val = (int) (Math.log(f[i][j - 1]) / Math.log(2)) + 1;f[i][j] = val;}}}private static void maintain1(int o) {num1[o] = num1[o * 2] + num1[o * 2 + 1];}private static void cal1(int o, int l, int r) {if (l == r) {if (arr[l] == 1)num1[o] = 1;return;}int mid = (l + r) / 2;cal1(o * 2, l, mid);cal1(o * 2, mid + 1, r);maintain1(o);}private static void update(int o, int l, int r) {if ((ql <= l) && (qr >= r)) {add[o]++;return;}int mid = (l + r) / 2;if (mid >= ql)update(o * 2, l, mid);if (mid + 1 <= qr)update(o * 2 + 1, mid + 1, r);}private static void query(int o, int l, int r, int addnum) {int anum = addnum + add[o];if (anum >= 5) {ans = ans + (long)((r - l + 1) * 2 - num1[o]);return;}if (l == r) {ans = ans + f[l][anum];return;}int mid = (l + r) / 2;query(o * 2, l, mid, anum);query(o * 2 + 1, mid + 1, r, anum);}public static void main(String[] args) throws IOException {// TODO Auto-generated method stubReader.init(System.in);n = Reader.nextInt();m = Reader.nextInt();arr = new int[n + 1];for (int i = 1; i <= n; i++)arr[i] = Reader.nextInt();init();num1 = new int[4 * n + 1];add = new int[4 * n + 1];cal1(1, 1, n);for (int i = 1; i <= m; i++) {ql = Reader.nextInt();qr = Reader.nextInt();update(1, 1, n);ans = 0;query(1, 1, n, 0);System.out.println(ans);}}}

蓝桥杯 Log大侠 题解相关推荐

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

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

  2. 2021 第十二届 蓝桥杯 双向排序 题解 栈+文艺平衡树

    2021 第十二届蓝桥杯 双向排序 题解 栈+文艺平衡树 题目描述 思路 实现方法 代码 只用栈 只用栈的代码 题目描述 原题链接:https://www.lanqiao.cn/problems/14 ...

  3. 第十一届蓝桥杯 决赛 部分题解 C/C++ 通俗易懂版 保证初中生和高中生能够看懂的题解

    宇宙第一小正太\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- 试题:扩散 题目描述: 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 小 ...

  4. 第十届蓝桥杯真题题解

    目录 一.组队(DFS) 二.年号字串(进制转换) 三.数列求值 四.数的分解 五.迷宫(BFS) 六.特别数的和(暴力) 七.完全二叉树的权值 一.组队(DFS) 题目描述 本题为填空题,只需要算出 ...

  5. 第十一届蓝桥杯校内赛题解

    1 问题描述 两个二进制数11110011101和1111101001的和是多少?请用二进制表示,注意在提交的时候不要提交前导0. 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结 ...

  6. 2016年蓝桥杯省赛题解

    题目地址:http://oj.ecustacm.cn/viewnews.php?id=1021 目录 四平方和[二分 / 预处理] 煤球数目[递推] 凑算式[全排列] 平方怪圈[打表找规律] 冰雹数[ ...

  7. 2020年十月蓝桥杯A组题解【10月17日】【附完整代码】

    填空1 题意:输出1到2020之中,数字2出现了一共多少次. 题解:有手就行 用时:3min 正确答案:624 代码: #include <bits/stdc++.h> using nam ...

  8. 第十届蓝桥杯省赛题解+代码

    文章目录 组队(5分)(暴力) 年号字符(5分) 题解 AC 数列求值(10分)(递推) 题解 AC 数的分解(10分)(暴力) 题解 AC 迷宫(15分)(BFS) 题解 AC代码 特别数的和(15 ...

  9. 2022第十三届蓝桥杯web组题解

    文章目录 01水果拼盘 题目 解答 02展开你的扇子 题目 解答 03和手机相处的时光 题目 解答 04灯的颜色变化 题目 解答 05冬奥大抽奖 题目 解答 06蓝桥知识网 题目 解答 07布局切换 ...

最新文章

  1. MIT给人工智能“泼冷水”:AI创造性目前有限
  2. 为什么要预留字段_「镜前灯电线预留位置」为什么要安装镜前灯 镜前灯电线预留位置...
  3. 博士选题的态度:商量着来
  4. c#启动mysql数据库服务器_c#判断数据库服务器是否已经启动的方法
  5. hdu 4588 Count The Carries
  6. 接口-----java
  7. Opencl 并行求和
  8. 需要清除memcach缓存方能解决的几个报错
  9. Python基础----列表
  10. apache geode项目结构_使用IntelliJ IDEA+Maven 创建、开发、管理项目
  11. 彩色静电植绒印花工艺的五个方法
  12. mac vulkan_在 macOS 上开发 Vulkan 程序
  13. QT目录遍历(QDir)
  14. 投资学U18 股票估值 课后习题解读
  15. Echarts去除x轴,y轴网格线,网格区域(背景)
  16. 2013年9月19日
  17. otg usb 定位_教你简单认识OTG与OTG线
  18. [转NN网]求求百度给网站一点生存的空间吧!
  19. 网站下拉菜单,选择下拉后自动填充(图)
  20. 个人信用卡融资你了解过吗?

热门文章

  1. WPF的Popup控件使用
  2. 客户端渲染和服务端渲染
  3. 货币兑换表设计mysql_不同币种换汇及汇率数据库表结构设计
  4. 傲游浏览器(Maxthon)2.0.3RC发布
  5. 手术的最优化分配(4)——随机规划模型及样本平均近似(SAA)方法代码实现
  6. charles 小米手机安装证书
  7. linux进程后台运行的几种方法 - nohup/setsid//disown/screen
  8. ngnix location 匹配规则
  9. 血液与病毒:新冠病毒感染概率与血型有关吗?
  10. 一生受用的三张PPT