csp-c模拟测试43「A·B·C」

时间:2019-09-15
本文章向大家介绍csp-c模拟测试43「A·B·C」,主要包括csp-c模拟测试43「A·B·C」使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

A

题解

代码

B

题解

代码

C

题解

三分,对于怎么看出来三分,这可能是个套路,你觉得这个题你用贪心做不了(但非常像贪心),二分答案会被hack,然后你$dp$也难以做,你三分就可以了

三分$check$贪心做,很水,我会说

代码

/*
n*log^2
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 222222
struct node{
    ll l,r;
    friend bool operator < (const node & a,const node &b){
        return a.l==b.l?a.r>b.r:a.l<b.l;
    }
}wat[A];
ll n,m,t,ans=0x7fffffffffffff,maxx=0,cnt=0;
ll p[A],lef[A],now[A],c[A];
ll check(ll x){
    ll sum=0;
    for(ll i=1;i<=n;i++){
        now[i]=max(p[i]-x,0ll);
        c[i]=0;
    }
    for(ll i=1;i<=n;i++){
        ll nowid=lef[i];
        c[i]+=c[i-1];
        if(lef[i]==0) continue ;
        ll cha=c[i];
//        printf("i=%lld c[i]=%lld c[i-1]=%lld\n",i,c[i],c[i-1]);
//        printf("i=%lld now+cha=%lld\n",i,now[i]+cha);
        if(now[i]+cha>0){
            sum+=now[i]+cha;
            c[i]-=(now[i]+cha);
            c[wat[nowid].r+1]+=now[i]+cha;
            now[i]=0;
        }
    }
    for(ll i=1;i<=n;i++){
        ll cha=c[i];
//        printf("now=%lld x=%lld cha=%lld\n",now[i],x,cha);
        if(now[i]+cha>0) return 0x7fffffffff; 
    }
    return sum+x*t;
}
int main(){
//    freopen("da.in","r",stdin);
//    freopen("ans.bf","w",stdout);
    scanf("%lld%lld%lld",&n,&m,&t);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&p[i]);
        maxx=max(maxx,p[i]);
    }
    for(ll i=1;i<=m;i++){
        scanf("%lld%lld",&wat[i].l,&wat[i].r);
    }
    sort(wat+1,wat+m+1);
    for(ll i=1;i<=m;i++){
        if(!lef[wat[i].l])
            lef[wat[i].l]=i;
    }
    for(ll i=1;i<=n;i++)
        if(wat[lef[i-1]].r>=i){
            if(wat[lef[i-1]].r>wat[lef[i]].r)
                lef[i]=lef[i-1]; 
        }
    ll l=0,r=maxx;
    while(l<r){
        ll len=(r-l);
        ll lmid=l+len/3,rmid=r-len/3;
        
        ll lnow=check(lmid),rnow=check(rmid);
//        printf("l=%lld r=%lld\n",l,r);
        if(lnow>=rnow) l=lmid+1;
        else r=rmid-1;    
        ans=min(ans,lnow);
        ans=min(ans,rnow);
    }
//    printf("%lld\n",check(5));
    printf("%lld\n",ans);
}    
View Code

原文地址:https://www.cnblogs.com/znsbc-13/p/11524078.html