1678: Log大侠 java

时间限制: 2 Sec  内存限制: 256 MB
提交: 20  解决: 1

题目描述

    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>, 不能通过工程设置而省略常用头文件。

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

 

区间问题显然线段树,but做题时想到一种区间合并做法,相对更优。

这里采用反向求和,即先把初始和求出,然后每次操作后减去改变的差值。

因为任何正整数经过若干次log操作后只会有两种情况1和2(除1本身不变,其余变为2)

我们暂且名其为奇异情况,当遇到奇异情况时数不会再改变,我们可以跳过对其的操作。

然后就是区间合并。使用并查集,遍历对应值祖先,若当前值变为奇异情况则将其合并(当前值祖先变为下个值祖先)

笔者开始使用递归处理并查集,结果吃了次运行错误,究其原因是Java的递归效率远低于循环!

因为在Java中每层递归都会增加额外的堆栈处理,占用过多内存,所以在比赛中应尽量减少使用递归或使用循环代替

这次也算是教训吧,幸好在赛前发现看来要改改习惯了

import java.util.Scanner;

public class Main {

    static Scanner sc = new Scanner(System.in);
static long[] a = new long[100005];
static int[] f = new int[100005];
static int find(int x) { //循环式路径压缩
int p=x;
while(f[p]!=p){
p=f[p];
}
while(x!=p){
int t=f[x];
f[x]=p;
x=t;
}
return x;
}
static long cal(long x) {
long ans=0;
while(x>0) {
x>>=1;
ans++;
}
return ans;
}
public static void main(String[] args) { int n,m,l,r,i,j;
long ans=0;
n=sc.nextInt();
m=sc.nextInt();
for(i=1;i<=n;i++) {
a[i]=sc.nextLong();
ans+=a[i];
f[i]=i;
}
f[n+1]=n+1;
while((m--)>0) {
l=sc.nextInt();
r=sc.nextInt();
for(i=find(l);i<=r;i=find(i+1)) { //区间合并
long t=cal(a[i]);
ans-=a[i]-t;
a[i]=t;
if(a[i]<3) {
int fi=find(i),fi1=find(i+1);
if(fi!=fi1) {
f[fi]=fi1;
}
}
}
System.out.println(ans);
}
}
}

2014年第五届蓝桥杯国赛 Log大侠(区间合并+Java递归效率分析)的更多相关文章

  1. 2014年第五届蓝桥杯国赛试题(JavaA组)

    1.结果填空 (满分15分)2.结果填空 (满分45分)3.代码填空 (满分30分)4.程序设计(满分30分)5.程序设计(满分80分)6.程序设计(满分100分) 1.标题:海盗分金币 有5个海盗, ...

  2. 2014年第五届蓝桥杯省赛试题(JavaA组)

    1.结果填空 (满分2分)2.结果填空 (满分6分)3.结果填空 (满分7分)4.代码填空 (满分4分)5.代码填空 (满分12分)6.结果填空 (满分12分)7.结果填空 (满分9分)8.程序设计( ...

  3. 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结

    第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...

  4. 2018年第九届蓝桥杯国赛总结(JavaB组)

    懒更,之前的删了补一个国赛总结 记yzm10的第一次国赛(赛点:首都经贸大学) 第一次就拿到了国一,运气不要太好~(同组lz学长豪取国特orz) 从省赛一路水过来,总算有了点成绩.其实最后一题有些遗憾 ...

  5. 2019年第十届蓝桥杯国赛总结(JavaA组)

    JavaA组国二,可以报销了~ JA死亡之组可不是盖的,rank12的排名还是拿不到国一啊(只有五个.. 出成绩的一刻波澜不惊,毕竟去年有国一了不慌哈哈哈 不过对我来说这个结果还算意料之外吧,毕竟大三 ...

  6. 2014年第五届蓝桥杯C/C++程序设计本科B组决赛

    1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...

  7. 2015年第六届蓝桥杯国赛试题(JavaA组)

    1.结果填空 (满分15分)2.结果填空 (满分35分)3.代码填空 (满分31分)4.程序设计(满分41分)5.程序设计(满分75分)6.程序设计(满分103分) 1.标题:胡同门牌号 小明家住在一 ...

  8. 2014年第五届蓝桥杯JavaB组省赛试题解析

    题目及解析如下: 题目大致介绍: 第一题到第三题以及第六题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第七题到第十题是编程题,要求编程解决问题 ...

  9. 2014年第五届蓝桥杯C/C++B组省赛题目解析

    一.啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提交答 ...

随机推荐

  1. 【题解】Greatest Common Increasing Subsequence

    [题解]Greatest Common Increasing Subsequence vj 唉,把自己当做DP入门选手来总结这道题吧,我DP实在太差了 首先是设置状态的技巧,设置状态主要就是要补充不漏 ...

  2. 【题解】P2444 病毒

    [题解][P2444 POI2000]病毒 一道\(ac\)自动机好题... 考虑危险的字符串是什么意思,就是在这个文本串中有模式串的匹配,这样的匹配可以通过\(ac\)自动机完成. 那么给定一个字符 ...

  3. python -- redis连接与使用

    前面我们简单介绍了redis nosql数据库,现在我们在python里面来使用redis. 一.python连接redis 在python中,要操作redis,目前主要是通过一个python-red ...

  4. iOS本地数据存取,看这里就够了

    本文授权转载,作者:hosea_zhou(简书) 应用沙盒 1)每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 2) ...

  5. python 安装coreml

    2.安装pip,  下载get-pip.py, https://bootstrap.pypa.io/get-pip.py,然后Python 这个文件,如果没有权限就加sudo 3.安装coreml:这 ...

  6. adaptiveThreshold自适应二值化源码分析

    自适应二值化介绍: 二值化算法是用输入像素的值I与一个值C来比较,根据比较结果确定输出值. 自适应二值化的每一个像素的比较值C都不同,比较值C由这个像素为中心的一个块范围计算在减去差值delta得到. ...

  7. centos7搭建redis主从复制,并模拟故障切换。

    Cntos7搭建redis主从复制,并模拟故障主从切换 主从复制搭建 主机:192.168.161.179 从机:192.168.161.180 1.        安装主redis 自己本地环境,关 ...

  8. Jmeter-配置原件-HTTP Cookie管理器

    线程组右键 -- 添加  -- 配置原件 -- HTTP Cookie管理器 如何定位到自己的cookie?以Google  Chrome浏览器为例: 1.打开浏览器,打开开发者工具 2.登录站点 3 ...

  9. T59

    Working without a break makes you more prone to error. The great drawback to living near a main road ...

  10. base64编码方式

    一.编码的两大方式: 在python3.x中,字符串编码分为unicode和bytes两大类编码方式. 直接书写s='中国人',这种方式定义的编码方式为unicode,是通用的方式. 另一种是byte ...