蓝桥杯 Log大侠 题解
标题: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大侠 题解相关推荐
- java实现第五届蓝桥杯LOG大侠
LOG大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力- 变换的规则是: 对其某个 ...
- 2021 第十二届 蓝桥杯 双向排序 题解 栈+文艺平衡树
2021 第十二届蓝桥杯 双向排序 题解 栈+文艺平衡树 题目描述 思路 实现方法 代码 只用栈 只用栈的代码 题目描述 原题链接:https://www.lanqiao.cn/problems/14 ...
- 第十一届蓝桥杯 决赛 部分题解 C/C++ 通俗易懂版 保证初中生和高中生能够看懂的题解
宇宙第一小正太\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- 试题:扩散 题目描述: 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 小 ...
- 第十届蓝桥杯真题题解
目录 一.组队(DFS) 二.年号字串(进制转换) 三.数列求值 四.数的分解 五.迷宫(BFS) 六.特别数的和(暴力) 七.完全二叉树的权值 一.组队(DFS) 题目描述 本题为填空题,只需要算出 ...
- 第十一届蓝桥杯校内赛题解
1 问题描述 两个二进制数11110011101和1111101001的和是多少?请用二进制表示,注意在提交的时候不要提交前导0. 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结 ...
- 2016年蓝桥杯省赛题解
题目地址:http://oj.ecustacm.cn/viewnews.php?id=1021 目录 四平方和[二分 / 预处理] 煤球数目[递推] 凑算式[全排列] 平方怪圈[打表找规律] 冰雹数[ ...
- 2020年十月蓝桥杯A组题解【10月17日】【附完整代码】
填空1 题意:输出1到2020之中,数字2出现了一共多少次. 题解:有手就行 用时:3min 正确答案:624 代码: #include <bits/stdc++.h> using nam ...
- 第十届蓝桥杯省赛题解+代码
文章目录 组队(5分)(暴力) 年号字符(5分) 题解 AC 数列求值(10分)(递推) 题解 AC 数的分解(10分)(暴力) 题解 AC 迷宫(15分)(BFS) 题解 AC代码 特别数的和(15 ...
- 2022第十三届蓝桥杯web组题解
文章目录 01水果拼盘 题目 解答 02展开你的扇子 题目 解答 03和手机相处的时光 题目 解答 04灯的颜色变化 题目 解答 05冬奥大抽奖 题目 解答 06蓝桥知识网 题目 解答 07布局切换 ...
最新文章
- MIT给人工智能“泼冷水”:AI创造性目前有限
- 为什么要预留字段_「镜前灯电线预留位置」为什么要安装镜前灯 镜前灯电线预留位置...
- 博士选题的态度:商量着来
- c#启动mysql数据库服务器_c#判断数据库服务器是否已经启动的方法
- hdu 4588 Count The Carries
- 接口-----java
- Opencl 并行求和
- 需要清除memcach缓存方能解决的几个报错
- Python基础----列表
- apache geode项目结构_使用IntelliJ IDEA+Maven 创建、开发、管理项目
- 彩色静电植绒印花工艺的五个方法
- mac vulkan_在 macOS 上开发 Vulkan 程序
- QT目录遍历(QDir)
- 投资学U18 股票估值 课后习题解读
- Echarts去除x轴,y轴网格线,网格区域(背景)
- 2013年9月19日
- otg usb 定位_教你简单认识OTG与OTG线
- [转NN网]求求百度给网站一点生存的空间吧!
- 网站下拉菜单,选择下拉后自动填充(图)
- 个人信用卡融资你了解过吗?