首页 > 其他分享 >Codeforces Round 973 (Div. 2) - D题二分

Codeforces Round 973 (Div. 2) - D题二分

时间:2024-10-01 16:35:31浏览次数:5  
标签:二分 973 题意 ll Codeforces mid num Div 这道题

首先这道题的一个坑点就是求max(a[1], a[2], ..., a[n])和求min(a[1], a[2], ..., a[n])是完全独立的,不会相互影响(可能是我读题能力太差,一直卡在这点了。。。)
这道题二分是一种很好想的方法,题中提到max和min,我们就可以想到只要让最大值最小,让最小值最大就可以达到我的目的了,二分的mid就是我们拟定的最大值的最小最小值的最大(非常明显的二分,但赛时我没想出来。。。)当然操作要根据a[i] - 1、a[i + 1] + 1来进行,这样这道题就完成了,接下来放代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll n;
vector <ll> b;
bool check1(ll num){
    //由于a[i] - 1、a[i + 1] + 1的性质
    //所以想要让前面的数a[i]变大,a[i - 1]就要减少,所以从后往前遍历
    for(ll i = n; i > 1; i --){
        if(b[i] < num){
            b[i - 1] -= num - b[i];
        }
    }
    return b[1] >= num;
}
bool check2(ll num){
    //同理从前往后遍历
    for(ll i = 1; i < n; i ++){
        if(b[i] > num){
            b[i + 1] += b[i] - num;
        }
    }
    return b[n] <= num;
}
void slove(){
    cin >> n;
    vector <ll> a(n + 1);
    for(ll i = 1; i <= n; i ++)
        cin >> a[i];
    ll mx = 0, mn = 0;
    ll l = 1, r = 1e12;
    // 最小值最大
    while(l < r){
        b = a;
        ll mid = l + r + 1 >> 1;
        if(check1(mid))
            l = mid;
        else
            r = mid - 1;
    }
    mn = l;
    l = 1, r = 1e12;
    // 最大值最小
    while(l < r){
        b = a;
        ll mid = l + r >> 1;
        if(check2(mid))
            r = mid;
        else
            l = mid + 1;
    }
    mx = l;
    cout << mx - mn << endl;
    return ;
}
int main(){
    ll t;
    cin >> t;
    while(t --){
        slove();
    }
    return 0;
}

最近感觉做题对于题意的把握太差了,要不就是容易假题意,要不就是很长时间才能理解题意,需要加强理解能力,就像是这道题,我一直在纠结max会影响min,但实际上他们是相互独立的,题目隐晦的告诉这点了,还是理解能力太差了

标签:二分,973,题意,ll,Codeforces,mid,num,Div,这道题
From: https://www.cnblogs.com/-zzuxx-/p/18442947

相关文章

  • Codeforces Round 976 (Div. 2)
    VP的这一场,真的唐完了。。。A.FindMinimumOperations题意给你一个\(n\)和\(k\),每次操作可以让\(n\)减去一个\(k\)的\(x\)次方,即\(n-k^x\)。问你最少操作几次能够让\(n\)变成\(0\)。思路我们先考虑如果\(k\)是\(2\)的情况,那么题目就转化成了\(n\)的......
  • Codeforces Round 958 (Div. 2)
    手速前三题,D题想到树形dp但是没做出来。A.SplittheMultiset题意给你一个多集,一开始这个多集里只有一个数字。每次操作可以选择删掉多集里的一个数,然后添加\(k\)个数,并且使得这\(k\)个数的和等于删掉的数。问你最少需要操作多少次多集里的数的个数等于等于\(n\)。思路......
  • codeforces round 975 E(div.2)(lambda表达式实现dfs,min_element函数,一定要优化重复的
    解题历程:看到题目要求要用最少的消除次数让所有叶子深度相同,通过观察,那么就只需要将所有深度都尝试一遍就行了,可是我当时没多想就用dfs记录所有节点的深度,单独将所有叶子和该叶子的深度存起来,记录最大的深度,从最大深度尝试到深度0,对于深度小于当前尝试深度的叶子,用dfs的方式将与......
  • Codeforces Round 976 (Div. 2) and Divide By Zero 9.0
    目录写在前面A签到B数学,模拟C二进制,拆位D暴力,并查集E概率DPF写在最后写在前面补题地址:https://codeforces.com/gym/104128。上大分失败呃呃呃呃有点过载了妈的我现在应该去打会儿游戏。A签到等价于求\(n\)在\(k\)进制下各位之和,写一个类似快速幂的东西。///*By......
  • Codeforces Round 975 (Div. 2)
    C.CardsPartition(C)对于每个确定的size,有便捷的方法判断该值是否合法:组数最小为\(a_{max}\),若\(k\)张牌可以填出\(a_{max}\)组牌堆则合法;将余下的牌当成新的一组,若\(k\)张牌可以凑出一整组则合法;其余情况不合法。由于check过程为\(O(1)\),可从大到小暴力枚举size,时间......
  • [数据集][目标检测]剪刀石头布检测数据集VOC+YOLO格式1973张3类别
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1973标注数量(xml文件个数):1973标注数量(txt文件个数):1973标注类别数:3标注类别名称:["bu","jiandao","shitou"]每个类别标注的框......
  • Codeforces Round 976 (Div. 2)
    传送门A.输出\(n\)在\(k\)进制下各数位之和B.一个位置被反转当且仅当有奇数个因子,有奇数个因子的数一定是完全平方数。二分\(n\)即可C.枚举二进制下每一位,发现\(b,c,d\)再这一位最多有八种可能,对于每一种情况都能得到在这一位\(a\)的值,分类讨论就行了。D.E.\(......
  • Codeforces Round 976 (Div. 2)
    B:很容易发现只有因数个数为偶数的灯泡是亮的。所以只有完全平方数的因数是奇数个。实现上可以二分。但是sqrt是double的必须开sqrtl才是longdouble的,才能满足这题longlong的数据范围。人给我卡傻了。哈哈。#include<bits/stdc++.h>usingnamespacestd;#defineintunsign......
  • 南沙C++信奥赛陈老师解一本通题 1973:【16NOIP普及组】买铅笔
    ​ 【题目描述】P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小......
  • Codeforces Round 975 (Div. 2) CE
    来源:CodeforcesRound975(Div.2)C.CardsPartition题意本身有\(a_i\)张\(i\)牌,现在将牌分成若干份,每一份牌数相等,且每一份都由不同的牌组成同时有\(k\)次补充任意牌的机会,求最多分成一份几张牌思路假定分成\(m\)份,每份\(p\)张牌,那么所有牌加补充的牌等于\(m*p......