牛客多校第二场g题 transform

思路:  二分

因为对于物品个数打一个前缀和的话,是具有单调性的。 所以可以用二分的思想。在jud函数中借鉴了大佬们的尺取写法。我们可以二分答案,然后jud中枚举左端点,然后可以二分右端点和mid点,可能细节多一些。比较好的一个办法就是尺取的写法。

代码: 

#include

using namespace std;
typedef long long ll;
const int N =500005;

struct node
{
    ll x;
    ll cnt;
}a[N];

int n;
ll T;
ll prew[N];
ll postw[N];
ll prec[N];
ll postc[N];

bool cmp(node a,node b)
{
    return a.x=1;i--) postc[i]=postc[i+1]+a[i].cnt;
    for(int i=1;i<=n;i++) prew[i]=prew[i-1]+prec[i-1]*dis(i,i-1)*2;
    for(int i=n;i>=1;i--) postw[i]=postw[i+1]+postc[i+1]*dis(i+1,i)*2;
    /*cout<n || mid>n) break;
        ll cc=num-(prec[r-1]-prec[l-1]);
        ll s=cal_pre(l,mid)+cal_suf(mid,r-1)+cc*(a[r].x-a[mid].x)*2;
        //   s == 左半边的花费(个数不够num2 +cc == num2 ) +  右半边的花费 + 右半边cc的花费
        if(s<=T) return true;
        l++;
    }
    l=n;r=n;mid=n;
    while(1){
        while(l>=1 && prec[r]-prec[l-1]=1 && prec[mid]-prec[l-1]>1;
        //cout<<"mid "<

 

你可能感兴趣的:(二分)