这是第一篇博客?日志也行。。。
codeforces problem 768B
这个题做了很长时间--好几天吧,有空的时候就想怎么做。
问题描述看 http://codeforces.com/problemset/problem/768/B
看起来是个三叉树的题目。最开始我想用递归完成,遍历每一个节点,并判断节点是否在区间内,累加区间内的1。
但是2^50的数量级不可能在规定time和memory的情况下完成。

做了很多草稿,才逐渐明白以下几点,
1. 只有x mod 2才会产生0, 其余叶肯定都是1,所以只用数区间[L,R]的0的个数
2. 把每一步看做三叉树,我们只需要简单的计算(x 循环除 2,直到结果为1)就可以知道该树的最大层数 max
3. 三叉树的层数肯定不会超过50,并且每一层的“中间叶节点”都是相同的(x mod 2),用数组temp记录每一层的叶节点值
4. 第 k 层 的第 0 个叶节点左边共有 ADL = 2^(max - k + 1)个叶节点,
5. 第 k 层 的第 0 个叶节点编号为 ADL + 1 = 2^(max - k + 1) + 1,
6. 第 k 层 的第 x 个叶节点编号为多少? 同样可以算出来 location = (2 * x + 1) * ADL + 2 * x + 1 = (2 * x + 1) * (ADL + 1)
7. 到这一步,我们可以根据变量 k ∈ [1,max] 遍历出每一层每一个叶节点的位置编号,判断是否在[L,R]内,然后根据层数累加0的个数
8. 但是这样效率仍然不高,我们实际上还是遍历了整棵树的一半的叶节点。 还得根据location, L, R的关系计算 x 的范围
9. L < location < R 求出每一层的 x 的范围,然后再累加x对应的叶节点的取值.
10. 至少做到上面这些才够.事实上还可以优化.
11. 需要提前额外考虑初始值为0或1的情况。

Java源码奉上,仅供参考,

import java.util.Scanner;public class Simple {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);long[] data = getnumber(sc.nextLine());int[] temp = new int[51];int sum = 0;int i = 1;if(data[0] == 0 || data[0] == 1){System.out.print(data[0]);}else {for (; i < temp.length; i++) {temp[i] = (int) (data[0] % 2);data[0] = data[0] / 2;if(data[0] == 1){break;}}for (int k = 1; k <= i; k++) {long add = (long) (Math.pow(2, i-k+1) - 1);long low = (data[1] - add - 1)/(2*(add + 1));long high = (data[2] - add - 1)/(2*(add + 1));for (long x = low; x <= high; x++) {long location = (2 * x + 1) * add + 2 * x + 1;if(location >= data[1] && location <= data[2]){if(temp[k] == 0){sum++;}}}}System.out.println(data[2] - data[1] - sum + 1);}}public static long[] getnumber(String temp) {String[] t = temp.split("\\s");long[] data = new long[t.length];for(int i=0;i < t.length;i++){data[i] = Long.valueOf(t[i]);}return data;}}

  

转载于:https://www.cnblogs.com/weihuan098/p/6484559.html

codeforces problem 768B相关推荐

  1. Codeforces Problem 717C Potions Homework(排序)

    此文章可以使用目录功能哟↑(点击上方[+]) 比赛链接→Bubble Cup 9 - Finals [Online Mirror]  Codeforces Problem 717C Potions H ...

  2. Codeforces Problem 708A Letters Cyclic Shift(implementation)

    此文章可以使用目录功能哟↑(点击上方[+]) 比赛链接→AIM Tech Round 3 (Div. 1)  Codeforces Problem 708A Letters Cyclic Shift ...

  3. Codeforces problem 67E(多边形求内核的应用)

    题目:E. Save the City! /* Goujinping 2013.4.12 NEFU The masterplate of Polygon kernel. Now the global ...

  4. codeforces problem 140E New Year Garland

    排列组合题 题意 用m种颜色的彩球装点n层的圣诞树.圣诞树的第i层恰由l[i]个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同.求有多少种装点方案,答案对p取模. 只 ...

  5. ECJTUACM16 Winter vacation training #4 题解源码

    https://vjudge.net/contest/149692#overview 这周一VJ比赛,题解&源码已完成! A.................................. ...

  6. 写过的比较难受的题目

    难受的 100. 增减序列 - AcWing题库 1460. 我在哪? - AcWing题库 Problem - 3410 (hdu.edu.cn) 题目-最长公共子序列Lcs (51nod.com) ...

  7. Codeforce 712A Memory and Crow

    A. Memory and Crow time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...

  8. 2022-03-10每日刷题打卡

    2022-03-10每日刷题打卡 力扣--每日一题 589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 . n 叉树 在输入中按层序遍历进行序列化表示,每 ...

  9. linux sftp创建多用户,Linux 下创建 sftp 用户并限定目录

    Linux 下创建 sftp 用户并限定目录 1.创建 sftpUser 用户组 [root@XXX ~]# groupadd sftpUser 2.创建 sftpUser 用户并指定目录 [root ...

最新文章

  1. c#中总是提示“在代码运行时或者在禁用“只要一个进程中断,就中断所有进程”选项时,不允许进行更改。...
  2. redis未能启动服务器,redis服务启动不了的解决办法(服务器应非法关机了)
  3. c# 读取空行_c# – 从Excel读取时如何计算空行
  4. C语言实现希尔排序shell sort算法之二(附完整源码)
  5. Windows下IIS+PHP 5.2的安装与配置
  6. zookeeper启动失败
  7. 计算机毕业设计-基于SSM的酒店客房管理系统-JavaWeb酒店客房管理系统
  8. node js 生成视频链接(视频流)
  9. 【软考-软件设计师精华知识点笔记】第三章 数据结构
  10. Nuvoton M0518 之 记录数据到LDROM,数据掉电不丢失的方式
  11. 新手怎么购买阿里云服务器【图文教程】
  12. 小程序以及h5引入阿里图标不显示最简单解决方案
  13. 世界地图的制作(总体概念设计)
  14. 如何应对数千微服务组件带来的挑战?
  15. OpenWRT路由器使用ipv6拨号上网教程
  16. [C和指针] ch17. 经典抽象数据类型
  17. 如何使git忽略某些文件或文件夹
  18. python安装第三方库 找不到、匹配不到库的问题(多目标优化)
  19. 二、Mingw下载安装
  20. 谷粒商城三阶段课件_备考2021年初级会计考试几大阶段你知道吗?

热门文章

  1. 【Pytorch神经网络实战案例】18 最大化深度互信信息模型DIM实现搜索最相关与最不相关的图片
  2. Vue移动端项目——Vant 移动端 REM 适配
  3. 三、PHP框架Laravel学习笔记——路由参数、重定向、视图
  4. Chapter3-2_Speech Separation(TasNet)
  5. LeetCode 2039. 网络空闲的时刻(BFS)
  6. LeetCode 1845. 座位预约管理系统(set)
  7. LeetCode 1812. 判断国际象棋棋盘中一个格子的颜色
  8. ACwing 3. 完全背包问题(DP)
  9. LeetCode 951. 翻转等价二叉树(递归)
  10. linux里怎样压缩文件,如何在Linux中解压缩文件