[题解]CF1712D Empty Graph

思路

因为我们枚举的直径是具备单调性的,所以可以使用二分答案。

我们可以想一个事情,如果有两个点 uv,它们两点之间的最短路径要么是直接从 uv;要么是经过一个中转点 t,即:utv

然后,我们可以发现一个显然的规律,就是 t 一定是区间 a 中最小值的下标。

知道了这些,我们便可以得出一个结论:任意两点 u,v 的最短路径为 min(minlirai,2×min1inai)

接着,我们的 check 函数就很好想了。

我们根据上面的公式,可以推断出对于一个 i(lir),如果 2×ai<x 那么这个点是一定要修改的。

我们这些数是可以用前缀和维护的,于是我们可以用两个数组 s1,s2 分别维护 1iin 区间中的修改的数量。

随后,我们枚举一下 1n1,判断一下 ai<xai+1<x

最终我们的修改次数就是 min(s1i1+s2i+2+(ai<x)+(ai+1<x))

Code

#include <bits/stdc++.h>  
#define re register  
  
using namespace std;  
  
const int N = 1e5 + 10,inf = 1e9 + 10;  
int T,n,k;  
int arr[N],s1[N],s2[N];  
  
inline int read(){  
    int r = 0,w = 1;  
    char c = getchar();  
    while (c < '0' || c > '9'){  
        if (c == '-') w = -1;  
        c = getchar();  
    }  
    while (c >= '0' && c <= '9'){  
        r = (r << 3) + (r << 1) + (c ^ 48);  
        c = getchar();  
    }  
    return r * w;  
}  
  
inline bool check(int x){  
    int res = inf;  
    for (re int i = 1;i <= n;i++) s1[i] = s1[i - 1] + ((arr[i] << 1) < x);//前缀和   
    for (re int i = n;i;i--) s2[i] = s2[i + 1] + ((arr[i] << 1) < x);  
    for (re int i = 1;i < n;i++){//枚举 1 ~ n - 1   
        int cnt = s1[i - 1] + s2[i + 2];//记录当前答案   
        if (arr[i] < x) cnt++;  
        if (arr[i + 1] < x) cnt++;  
        res = min(res,cnt);//取 min   
    }  
    return (res <= k);//判断是否合法   
}  
  
int main(){  
    T = read();  
    while (T--){  
        int l = 0,r = 1e9;  
        n = read();  
        k = read();  
        s2[n + 1] = 0;//记得把这一位清零   
        for (re int i = 1;i <= n;i++) arr[i] = read();  
        while (l <= r){//二分板子   
            int mid = l + r >> 1;  
            if (check(mid)) l = mid + 1;  
            else r = mid - 1;  
        }  
        printf("%d\n",l - 1);//记得减 1   
    }  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18264798

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示