Codeforces 985 D - Sand Fortress

D - Sand Fortress

思路:

二分

有以下两种构造,

分别二分取个最小。

代码:

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pii pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head
ULL n, h;
bool check(ULL t) {
    ULL res;
    if(t >= h) res = (1+t)*t/2 + t*(t-1)/2 - h*(h-1)/2;
    else res = (1+t)*t/2;
    if(res >= n) return true;
    else return false;
}
bool Check(ULL t) {
    ULL res;
    if(t >= h) res = (1+t)*t - h*(h-1)/2;
    else res = (1+t)*t/2;
    if(res >= n) return true;
    else return false;
}
int main() {
    scanf("%llu%llu", &n, &h);
    ULL l = 0, r = 2e9, m = (l+r) >> 1;
    while(l < r) {
        if(check(m)) r = m;
        else l = m+1;
        m = (l+r) >> 1;
    }
    ULL ans;
    if(m >= h) ans = 2*m - h;
    else ans = m;
    l = 0, r = 2e9, m = (l+r) >> 1;
    while(l < r) {
        if(Check(m)) r = m;
        else l = m+1;
        m = (l+r) >> 1;
    }
    if(m >= h) ans = min(ans, 2*m - h + 1);
    else ans = min(ans, m);
    printf("%llu\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/widsom/p/9074529.html

时间: 2024-10-21 05:27:42

Codeforces 985 D - Sand Fortress的相关文章

CodeForces 985D Sand Fortress

Description You are going to the beach with the idea to build the greatest sand castle ever in your head! The beach is not as three-dimensional as you could have imagined, it can be described as a line of spots to pile up sand pillars. Spots are numb

codeforces 985 F. Isomorphic Strings

题目链接 https://codeforces.com/contest/985/problem/F 题意 首先定义两个长度相等字符串a,b同构,当且仅当a中的每个字母,b中只存在一个字母与之对应,并且两个字母出现位置要完全一致,a,b反过来也要满足. 给定一个长度为\(2 \times 10^5\)的字符串s,有很多次询问.每次询问s从x位置开始的长度为l的字串与从y开始的长度为l的字串是否同构. 分析 对每个字母出现位置的集合进行哈希. 比如对于字母\('k'\),我们把原串中出现\('k'\

Codeforces 985 E - Pencils and Boxes

E - Pencils and Boxes 思路: dp 先排个序,放进一个袋子里的显然是一段区间 定义状态:pos[i]表示小于等于i的可以作为(放进一个袋子里的)一段区间起点的离i最近的位置 显然,初始状态:pos[i] = 1,1 <= i <= k 状态转移: pos[i+1] = i+1 ,如果 a[i] - a[pos[i-k+1]] <= d , 因为在这种情况下pos[i-k+1] 到 i 可以放进一个袋子里,那么i+1就可以作为新的起点了 pos[i+1] = pos[

Codeforces 985

A B C D E 原文地址:https://www.cnblogs.com/Aragaki/p/9074853.html

Educational Codeforces Round 44#985DSand Fortress+二分

传送门:送你去985D: 题意: 你有n袋沙包,在第一个沙包高度不超过H的条件下,满足相邻两个沙包高度差小于等于1的条件下(注意最小一定可以为0),求最少的沙包堆数: 思路: 画成图来说,有两种可能,一种是y=h-x一次函数和常函数y=x组合,还有一种是先上升后下降的函数,注意斜率绝对值都是1: 二分答案,具体来说,我是二分了最大高度,主要是check()比较要思考,(昨天晚上没有细心写check,错过了很多AC:): 这个check中:如果最大高度 mid 比m小,说明不会有折线,直接考虑三角

【Codeforces 985 F】Isomorphic Strings

题意:给一个字符串\(s\),有\(q\)个询问 x y l 表示问从\(x,y\)开始的长度为\(l\)的子串是否等价. 等价的定义是是否可以形成一个映射\(f\),使得把所有的第一个字符串的字符经过映射后得到恰恰是第二个字符串. 思路:首先我们看如果一个字符串等价于另一个字符串,那么它们所有字符出现位置的哈希值可以一一对应. 那么我们可以处理前缀每个字符出现的哈希值. 那么我们就可以\(O(26)\)求出每次查询了. 一一对应很简单,就是排序之后相同就行了. 原文地址:https://www

Codeforces 599C Day at the Beach(想法题,排序)

C. Day at the Beach One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortunately, the weather was bad, so the friends were unable to ride waves. However, they decided to spent their time building sand castles. At the end of the

Codeforces Round #302 (Div. 2) (ABCD题解)

比赛链接:http://codeforces.com/contest/544 A. Set of Strings time limit per test:1 second memory limit per test:256 megabytes You are given a string q. A sequence of k strings s1,?s2,?...,?sk is called beautiful, if the concatenation of these strings is

Educational Codeforces Round 44 - E. Pencils and Boxes

标签 : DP 题目链接 http://codeforces.com/contest/985/problem/E 题意 把\(n\)个数分成多组,使得每组包含至少\(k\)个元素,且每组中的任意两个元素之差不超过\(d\) 分析 很巧妙的DP 我们使用dp[i]来表示(如果不存在i+1~n个元素的时候)前i个能否满足题目条件放入boxes中. dp[i]为true当且仅当存在一个j满足 \[ \left\{ \begin{aligned} a[j+1] \geq a[i]-d \\ dp[j]=