数学+二分

连续打了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. C++库文件解析(conio.h)

    转载:https://blog.csdn.net/ykmzy/article/details/51276596 Conio.h 控制台输入输出库该文内容部分参照百度百科 Conio.h 在C stan ...

  2. Matlab中image、imagesc和imshow函数用法解析

    来源:https://blog.csdn.net/zhuiyuanzhongjia/article/details/79621813 1.显示RGB图像 相同点:这三个函数都是把m*n*3的矩阵中的数 ...

  3. 【题解】[SDOI2010]捉迷藏

    题目链接:https://www.luogu.com.cn/problem/P2479 题目大意:求平面\(n\)个点中,到其它\(n-1\)个点的曼哈顿距离最大和最小距离之差最小的点,求出这个这个距 ...

  4. Web前后端:如何分离,如何解耦?

    摘要:在本文中我们一起来探讨一下为什么要在软件开发中进行前后端的分离,如何做到前后端分离,如何解耦. 简单地说,就是要把复杂的问题简单化,把一个从0到N的问题转化为N个0到1的问题.另一个相近的说法就 ...

  5. linux CentOS7 防火墙操作

    1, 查看防火墙状态: firewall-cmd --state systemctl status firewalld.service 2, 开启防火墙: systemctl start firewa ...

  6. 用IPV6隧道连接IPV4孤岛

    hostA和hostB之间是IPV6连接的,但是之前的服务只能支持IPV4,兼容IPV6比较困难.所以用隧道实现hostA和hostB之间用IPV4连接. hostA如下: ip -6 addr ad ...

  7. spring cloud 实现基于Nacos权重的负载均衡

    package com.water.step.service.user.nacos; import com.alibaba.nacos.api.exception.NacosException; im ...

  8. vs code个性化设置

    文件=>首选项=>设置,直接在搜索栏搜索有背景色的部分即可 1. 鼠标滚轮缩放 "editor.mouseWheelZoom": true 2. 显示空格和tab符号 ...

  9. 为什么C语言是最适合单片机编程的高级语言!

    为什么还在用C语言编程?答案是:C语言是最适合单片机编程的高级语言. 这个问题的意思应该是:现在有很多很好用的高级语言,如java,python等等,为什么这些语言不能用来编写单片机程序呢?那么这个问 ...

  10. 集训DP复习整理

    DP复习 集训%你赛2:测绘(审题DP) 经过2000+个小时的努力终于把这道题做出来的蒟蒻通 分析: 这道题我一直没做出来的原因就是因为我太蒟了题面看不懂,题面读懂了,其实不是特别难. 题目翻译: ...