首页 > 其他分享 >北方大学 ACM 多校训练赛 第五场(D. 节操大师 - 二分)

北方大学 ACM 多校训练赛 第五场(D. 节操大师 - 二分)

时间:2022-10-24 18:05:18浏览次数:46  
标签:include return int 第五场 ll 多校 节操 北方大学 define


Description

MK和他的小伙伴们(共n人,且保证n为2的正整数幂)想要比试一下谁更有节操,于是他们组织了一场节操淘汰赛。他们的比赛规则简单而暴力:两人的节操正面相撞,碎的一方出局,而没碎的一方晋级(脑补一下端午节的碰鸡蛋游戏>_<)。最后经过数轮淘汰决出冠军“节操大师”。

通过理性的研究,你测算出他们的节操值分别为1,2,…,n,我们不妨称这个值为“硬度”吧。同时你又测出了一个节操常数k:当两个硬度相差超过k的节操相撞时,硬度小的节操必碎;而当两个硬度相差不超过k的节操相撞时,由于现场操作的不确定因素,两个节操都有碎的可能(当然我们假设不会出现两边都碎的情况囧)。

显然,节操值较低的人也许没有任何可能得到冠军。下面就请你预测,这次比赛的冠军“节操大师”的节操最小值为多少。

Input

输入只有一行,两个正整数n和k分别表示参赛人数和节操常数。

Output

输出一行,一个正整数,表示“节操大师”的节操最小值。

Source

Nankai UniversityFreshman Programming Contest 2015
样例输入

8 2

样例输出

3

二分答案,从后往前·推

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <cstdlib>
#include <queue>
#include <stack>
#include<set>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int n,k;
bool check(int x) {
set<int> S;
set<int>::iterator it;
For(i,n) if (i!=x) S.insert(-i);S.insert(0);
vi v; v.pb(-x);
int i=0;
for(int l=1;l<=n/2;l<<=1) {
int now=SI(v);
For(j,l) {
int p=v[i++];
it=S.lower_bound(p-k);
int q=*it;
if (!q) return 0;
S.erase(q);
v.pb(q);v.pb(p);
}
}
return 1;
}
int main() {

{
n=read(),k=read();
int l=1,r=n,ans=-1;
while(l<=r) {
int m=(l+r)/2;
if (check(m)) ans=m,r=m-1;
else l=m+1;
}

printf("%d\n",ans);
}

return 0;
}


标签:include,return,int,第五场,ll,多校,节操,北方大学,define
From: https://blog.51cto.com/u_15724837/5790748

相关文章

  • 多校联测4
    三个字符串可还行T1.字符串还原我一开始读错题了,以为是要不断拆分,回头一看发现只用拆依次,这不就枚举断点,然后用\(hash\)判断不就行了吗。不过这样你会得到80分,原因是不同......
  • 多校联训 A 3
    A.考场上SB了,一个小细节写挂以为自己思路错误,直接就给弃了。点击查看代码#pragmaGCCoptimize(3)#include<bits/stdc++.h>#warningfastread!usingnamespacestd;......
  • 2022 牛客多校题解
    2022牛客多校题解Contest1JContest2JContest3HHack(SAM)枚举B中的右端点,查询最长在A串中向右可以延伸多长。考虑对A串建立一个SAM,然后对于B串从左到右跑SAM的D......
  • 2022杭电多校1
    1002Dragonslayer题目大意:给出一张的网格地图,给出起点和终点(均为方格的正中心),其中地图中有面墙阻隔了道路,每面墙都在网格线上并保证墙横平竖直,以线段端点的形式给,问......
  • 2021杭电多校1 J (普通莫队 树状数组)
    题意:给出1e5个二维平面上的坐标点0<=(x,y)<=1e5,1e5个询问,每次问x0,y0到x1,y1的矩阵中有多少y值不同的坐标点。思路:操作只有询问,不强制在线,数据范围1e5,就差把莫......
  • 2022杭电多校7
    这场难度有点大可改的题没几个B.IndependentFeedbackVertexSet题意:有1-n个点,每个点有权值。初始三个点的互相连接。接下来从第4个点开始,每次给出两个点,保证这两个......
  • 2022杭电多校8
    A.Theramore题意:给定一个01串,可以选择一个奇数长度的区间,使得该区间翻转,求任意次数操作后的最小字典序。分析:我们发现不管怎么转,奇数位置上的数永远在奇数上,偶数永远......
  • 2022杭电多校9
    J.SumPlusProduct题意:给定一个长度为n的数组,每次随机拿出两个数使其变成(a+b+a*b)再放回数组,最终数组中只剩下一个数,求剩余数字的期望是多少。分析:模拟一下......
  • 2022杭电多校10
    G.EvenTreeSplit题意:给定一个节点数为偶数的树,请问有多少种方案使得切割开一条边使得剩余连通块的大小都是偶数。分析:我们发现断开一条边是独立的,因为如果两个连通......
  • "蔚来杯"2022牛客暑期多校训练营5
    ADon'tStarve巧妙在于拓扑排序为啥要开滚动数组因为对于长度相同的边我们只能选择一条而这些边属于同一个状态的为了防止更新的时候对同状态的点造成影响#inclu......