数学+二分

连续打了3场$codeforces$,深深的被各种模拟贪心分类讨论的$C$,$D$题给恶心到了

还有永远看到题一脸懵的$B$题


首先考虑画出不同函数值迭代转移的关系,要注意考虑连边是否能成立,也就是满不满足函数的定义域

 

首先观察上图,可以发现如果$y$是偶数,节点$y$的左子树存在

但如果$y$是奇数,节点$y$的左子树不存在,因为$y+1$是偶数,不满足$f(x)=x-1$的定义域

并且右子树的所有节点都存在,因为都是奇数,如下图

那么现在统计一个定值$y$在$1-n$中经过$y$的$path$数,就是以y为根这棵树结点值小于等于n的节点数

观察可以发现,这些节点的值有规律

对于$2^{k}y$级别,树上的范围为$2^{k}y$到$2^{k}y+2^{k+1}-1$

那么可以在$log$的时间求出来

奇数的也是同理,$2^{k}y$到$2^{k}y+2^{k}-1$

但题目要求的是最大的$y$

那么可以分奇数偶数分别二分求解

 1 #include <bits/stdc++.h>
2 #define ll unsigned long long
3 #define inf (int)1e9
4 #define m_k make_pair
5 using namespace std;
6 ll n,k,z[63],ans;
7 bool check(ll mid)
8 {
9 if (mid==1)
10 return 1;
11 ll cnt=0;
12 if (mid%2==1)
13 {
14 for (int i=0;i<=62;i++)
15 {
16 if (z[i]*mid>n)
17 break;
18 if (z[i]*mid+z[i]-1<n)
19 cnt+=z[i];
20 else
21 {
22 cnt+=n-z[i]*mid+1;
23 break;
24 }
25 }
26 }
27 else
28 {
29 for (int i=0;i<=62;i++)
30 {
31 if (z[i]*mid>n)
32 break;
33 if (z[i]*mid+z[i+1]-1<n)
34 cnt+=z[i+1];
35 else
36 {
37 cnt+=n-z[i]*mid+1;
38 break;
39 }
40 }
41 }
42 if (cnt>=k)
43 return 1;
44 else
45 return 0;
46 }
47 int main()
48 {
49 scanf("%lld%lld",&n,&k);
50 if (k==n)
51 {
52 printf("1\n");
53 return 0;
54 }
55 z[0]=1;
56 for (int i=1;i<=62;i++)
57 z[i]=z[i-1]*2;
58 ll l,r;
59 l=0;r=(n-1)/2;
60 while (l<r)
61 {
62 ll mid=l+((r-l+1)>>1);
63 if (check(2*mid+1))
64 l=mid;
65 else
66 r=mid-1;
67 }
68 ans=2*l+1;
69 l=0;r=n/2;
70 while (l<r)
71 {
72 ll mid=l+((r-l+1)>>1);
73 if (check(2*mid))
74 l=mid;
75 else
76 r=mid-1;
77 }
78 ans=max(ans,2*l);
79 printf("%lld\n",ans);
80 }

CF1271E Common Number的更多相关文章

  1. Codeforces Round #608 (Div. 2) E. Common Number

    链接: https://codeforces.com/contest/1271/problem/E 题意: At first, let's define function f(x) as follow ...

  2. Codeforces Round #608 (Div. 2) E - Common Number (二分 思维 树结构)

  3. Codeforces Round #608 (Div. 2) E. Common Number (二分,构造)

    题意:对于一个数\(x\),有函数\(f(x)\),如果它是偶数,则\(x/=2\),否则\(x-=1\),不断重复这个过程,直到\(x-1\),我们记\(x\)到\(1\)的这个过程为\(path( ...

  4. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  5. [AX]AX2012 Number sequence framework :(三)再谈Number sequence

    AX2012的number sequence framework中引入了两个Scope和segment两个概念,它们的具体作用从下面序列的例子说起. 法国/中国的法律要求财务凭证的Journal nu ...

  6. Why Python is Slow

    Why Python is Slow: Looking Under the Hood https://jakevdp.github.io/blog/2014/05/09/why-python-is-s ...

  7. hadoop多文件格式输入

    版本号: CDH5.0.0 (hdfs:2.3.mapreduce:2.3,yarn:2.3) hadoop多文件格式输入,一般能够使用MultipleInputs类指定不同的输入文件路径以及输入文件 ...

  8. 一步步教你创建自己的数字货币(代币)进行ICO

    本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 ...

  9. Perl正则表达式引用

    正则表达式两篇: 基础正则 Perl正则 本文是对Perl正则的一点扩展,主要内容是使用qr//创建正则对象,以及一些其它的技巧. qr//创建正则对象 因为可以在正则模式中使用变量替换,所以我们可以 ...

随机推荐

  1. kalilinux2020.3的安装与一些坑

    1.下载镜像文件.iso kali官方下载太慢,用一些魔法也是不行,这里推荐用国内的下载源. 阿里云: https://mirrors.aliyun.com/kali-images/?spm=a2c6 ...

  2. 在Windows7系统中设置虚拟内存大小

    当我们的电脑物理内存空间不够用时,操作系统就会自动从硬盘空间上分出一块空间来当内存使用,这就是虚拟内存.可以说虚拟内存是物理内存的补充,是备用的物理内存.一般来说,如果电脑里的程序不多,占用内存资源不 ...

  3. JVM系列【6】GC与调优1

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 GC基础知识 什么是垃圾 ​ 没有任何引用指向的一个对象或多个对象(循环引 ...

  4. java基础小程序—万年历

    package day02.xiangmu.wannianli; import java.util.Scanner; public class CalendarTest { public static ...

  5. 超好用的UnixLinux 命令技巧 大神为你详细解读

    1.删除一个大文件 我在生产服务器上有一个很大的200GB的日志文件需要删除.我的rm和ls命令已经崩溃,我担心这是由于巨大的磁盘IO造成的,要删除这个大文件,输入: > /path/to/fi ...

  6. pyquery 匹配NavigableString

    pyquery 匹配NavigableString不像xpath那样精确找打匹配对象,只需匹配包含NavigableString的根节点

  7. Windows 上的苹果 mac Time Machine 时间机器免费替代品 FreeFileSync 操作指南

    Windows 上的苹果 mac Time Machine 时间机器免费替代品 FreeFileSync 操作指南 前言:为什么不用 Windows 10 自带的备份还原呢?因为不稳定,不能很好的备份 ...

  8. 扫描仪扫描文件处理-图像扫描加工到生成PDF步骤简述[JAVA版]

    另参见:https://www.cnblogs.com/whycnblogs/p/8034276.html 详细见:https://github.com/barrer/scan-helper 用途: ...

  9. 旋转子段 (思维stl)

    题目: 大概意思就是给你一个序列,你可以选择一段区间使它左右翻折一遍,然后呢,从1到n找一遍,看a[i]==i的数最多是多少. 其实刚才我已经把暴力思路说出来了,枚举每一个区间长度,枚举每一个左端点, ...

  10. linux(centos8):用cut显示文本内容的指定列

    一,cut命令的用途 从一个文本文件或者文本流中提取文本列 分别用: 字节.字符.字段 作为单位进行提取 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.co ...