二分题,求如何写check函数
  • 板块学术版
  • 楼主SakurajiamaMai
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/28 15:59
  • 上次更新2023/10/28 16:07:18
查看原帖
二分题,求如何写check函数
784813
SakurajiamaMai楼主2023/10/28 15:59

每一首歌在不同的频段有不同的响度,而EQ(Equalizer,均衡器)可以用来帮助调整各个频段的响度。为了方便精确地调整响度,谷米莱莉娅用时间魔法将一首歌的某个时刻切片了出来,因此现在只需要考虑这一个时刻的情况。

通常情况下,响度的大小范围在(−∞,0],这首歌一共有n(1≤n≤1e6)个频段的响度不为−∞。谷米莱莉娅的耳机拥有的EQ核心科技能够进行如下操作: 选定一个任意的连续频段闭区间,然后对其中所有频段的响度提升任意大小。现在谷米莱莉娅想提升歌曲的总体响度,于是她开始调她的EQ。她希望所有不为−∞的频段的响度中的最小值尽量大。但很快她就发现,如果存在频段的响度超过0,将会产生削波,让音乐变得不好听。所以她懒得调了,现在她希望你能帮她调好EQ,使得满足所有不为−∞的频段的响度中的最小值尽量大的同时,不存在频段的响度超过0。

样例输入1 复制 3 1 -2 2 -3 3 -5

样例输出1 复制 -2

样例输入2 复制 7 1 -2 2 -3 4 -6 7 -5 5 -4 3 -5 6 -7

样例输出2 复制 -3

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
struct node
{
    int id,num;
    bool operator<(const node&w)const{
        return id<w.id;
    }
}eq[N];
int n,t,a[N],f[N],res,num,ans,m,k;
bool vis,st;
bool check(int u)
{
    vis=false,st=false;
    int l=1e18,r=-1e18;
    for(int i=1;i<=n;i++){
        if(st&&eq[i].num<u) return false;
        if(vis&&eq[i].num<=u){
            int l_=eq[i].num-u,r_=eq[i].num;
            if(l<r_||r>l_) return false;
            l=min(l,l_),r=max(r,r_);
        }
        else if(vis) st=true;
        if(eq[i].num<u&&!vis) vis=true,l=eq[i].num-u,r=eq[i].num;
    }
    return true;
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>eq[i].id>>eq[i].num;
    sort(eq+1,eq+1+n);
    int l=-1e18,r=0;
    while(l<r){
        int mid=l+r+1>>1;
        if(check(mid)) l=mid;
        else r=mid-1;
    }
    cout<<r;
    return 0;
}
2023/10/28 15:59
加载中...