当前位置:网站首页>CFdiv2-Common Number-(奇偶数二分+规律)
CFdiv2-Common Number-(奇偶数二分+规律)
2022-08-10 22:10:00 【可爱美少女】
题意:
就是给你一个函数f(x) = x/2(如果x是偶数),f(x) = x-1(如果x是奇数且不为1)。定义path(15) = [15,14,7,6,3,2,1]。也就是他会走的数字直到为1。然后给你一个k,问你哪个数字在>=k个不同的path中出现过,如果有多个,输出最大的那个数。
思考:
- 既然问最大的,那么肯定可以二分,手推了推发现越小的数字出现在的path越多,那么就肯定是满足单调性的。然后比如check(mid),怎么算mid出现的path?
- 如果x是奇数,那么x包含在path(x),path(2x),path(2x+1),path(4x),path(4x+1),path(4x+2),path(4x+3)。发现最初的起点就是x第一层一个数,然后一直往下面拓展,每拓展一次就是一层的数。
如果x是偶数,那么x包含在path(x),path(x+1),path(2x),path(2x+1),path(2x+2),path(2x+3)。发现最初的起点是[x,x+1]第一层两个数,然后拓展,每次拓展就是一层。 - 刚开始我这样想的时候,感觉你这递归多少次呀,肯定超时了,虽然看起来像log,但是如果暴力dfs去搜每个分支这就是O(n)的。但是如果我每次只存这一层的两个端点呢?那么是不是就log(n)了。为什么每次都是一层呢?画图会发现,这就是一层一层连续的数。

- 然后我就去写了,但是发现不对呀。看了看图发现,并不是整个数都是单调的,而是分奇数偶数的。1>3>5>7…,2>4>6>8…,但是2并不大于3。所以两次二分,一次二分奇数一次二分偶数,每次取最大值就可以了,注意奇数偶数二分的写法。
代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define db double
#define int long long
#define PII pair<int,int >
#define mem(a,b) memset(a,b,sizeof(a))
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int mod = 1e9+7,inf = 1e18;
const int N = 2e5+10,M = 2010;
int T,n,m,k;
int get(int x)
{
queue<PII > q;
if(x&1) q.push({
x,x}); //这一层的左右区间,奇数就自己
else q.push({
x,x+1}); //偶数是两个
int sum = 0;
while(q.size())
{
auto now = q.front();q.pop();
sum += min(n,now.se)-now.fi+1; //这段区间可以加多少数
if(now.fi*2<=n) q.push({
now.fi*2,now.se*2+1}); //如果还可以扩展
}
return sum;
}
bool check(int mid)
{
int sum = get(mid);
return sum>=k;
}
signed main()
{
IOS;
cin>>n>>k;
int maxn = 0;
int l = 1,r = n&1?n:n-1; //初始范围
while(l<=r) //l<=r
{
int mid = (l+r)>>1;
if(mid%2==0) mid--; //如果不是奇数-1
if(check(mid))
{
l = mid+2; //+2
maxn = max(maxn,mid); //答案要在这里面更新
}
else r = mid-2; //-2
}
l = 2,r = n&1?n-1:n;
while(l<=r)
{
int mid = (l+r)>>1;
if(mid%2!=0) mid--;
if(check(mid))
{
l = mid+2;
maxn = max(maxn,mid);
}
else r = mid-2;
}
cout<<maxn;
return 0;
}
总结:
多多思考,画图模拟模拟。
边栏推荐
- 基于交流潮流的电力系统多元件N-k故障模型研究(Matlab代码实现)【电力系统故障】
- make & cmake
- [Maui official version] Create a cross-platform Maui program, as well as the implementation and demonstration of dependency injection and MVVM two-way binding
- 2022年8月的10篇论文推荐
- 测试4年感觉和1、2年时没什么不同?这和应届生有什么区别?
- JS use regular expressions in g model and non g difference
- B站数据分析岗实习生面试记录
- How to secure users in LDAP directory service?
- 2021IDEA创建web工程
- 高数_复习_第5章:多元函数微分学
猜你喜欢

Detailed installation steps and environment configuration of geemap

Service - DHCP principle and configuration

音乐播放器(未完成版本)

2022年8月10日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 ASP.NET Core 创建 Web UI(没看懂需要再看一遍)

Common interview questions for APP UI automation testing, maybe useful~

谁是边缘计算服务的采购者?是这六个关键角色

服务——DHCP原理与配置

LeetCode每日两题02:反转字符串中的单词 (均1200道)

RK3399平台开发系列讲解(内核驱动外设篇)6.35、IAM20680陀螺仪介绍

企业云存储日常运行维护实践经验分享
随机推荐
geemap的详细安装步骤及环境配置
shell programming without interaction
测试4年感觉和1、2年时没什么不同?这和应届生有什么区别?
What would happen if disconnecting during the process of TCP connection?
商家招募电商主播要考虑哪些内容
【开源教程5】疯壳·开源编队无人机-飞控固件烧写
水果沙拉酱
Conditional Statements of Shell Programming (2)
3598. 二叉树遍历(华中科技大学考研机试题)
JS中使用正则表达式g模式和非g模式的区别
Alibaba and Ant Group launched OceanBase 4.0, a distributed database, with single-machine deployment performance exceeding MySQL
Why general company will say "go back messages such as" after the end of the interview, rather than just tell the interviewer the result?
LeetCode每日一题(1573. Number of Ways to Split a String)
“数据引擎”开启前装规模量产新赛道,「智协慧同」崭露头角
shell编程之正则表达式与文本处理器
ThreadLocal全面解析(一)
Extended Chinese Remainder Theorem
2022年8月的10篇论文推荐
BM13 determines whether a linked list is a palindrome
Shell 编程--Sed