zoukankan      html  css  js  c++  java
  • 估值线段树

    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    # define maxn 1010
    using namespace std;
    typedef long long LL;
    int n,m;
    struct node{
        LL a,b,c;
    }g[maxn];
    struct Tree{
        LL a,mxb,mnb,c;
    }tr[4*maxn];
     
    int sc=0;
    LL Max(LL a,LL b){return a>b? a:b;}
    LL Min(LL a,LL b){return a<b? a:b;}
    void pushup(int rt){
        int ls=rt<<1, rs=rt<<1|1;
        tr[rt].a=Max(tr[ls].a,tr[rs].a);
        tr[rt].mnb=Min(tr[ls].mnb,tr[rs].mnb);
        tr[rt].mxb=Max(tr[ls].mxb,tr[rs].mxb);
        tr[rt].c=Max(tr[ls].c,tr[rs].c);
    }
    void bds(int rt,int l,int r){
        if(l==r){
            tr[rt].a=g[l].a; tr[rt].mxb=tr[rt].mnb=g[l].b; tr[rt].c=g[l].c;
            return;
        }
        int mid=(l+r)>>1;
        bds(rt<<1,l,mid);
        bds(rt<<1|1,mid+1,r);
        pushup(rt);
    }
    LL ans;
    void zheng_find(int rt,int l,int r,LL x,LL y){
        if(l==r){
            ans=Max(ans,tr[rt].a*x+tr[rt].mxb*y+tr[rt].c);
            return;
        }
        int mid=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
        LL ans1=tr[ls].a*x+tr[ls].mxb*y+tr[ls].c;
        LL ans2=tr[rs].a*x+tr[rs].mxb*y+tr[rs].c;
        if(ans1 > ans2) {
            if(ans>ans1) return;
            zheng_find(rt<<1,l,mid,x,y);
            if(ans<ans2) zheng_find(rt<<1|1,mid+1,r,x,y);
        }
        else{
            if(ans>ans2) return;
            zheng_find(rt<<1|1,mid+1,r,x,y);
            if(ans<ans1) zheng_find(rt<<1,l,mid,x,y);
        }
    }
    void fu_find(int rt,int l,int r,LL x,LL y){
        if(l==r){
            ans=Max(ans,tr[rt].a*x+tr[rt].mnb*y+tr[rt].c);
            return;
        }
        int mid=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
        LL ans1=tr[ls].a*x+tr[ls].mnb*y+tr[ls].c;
        LL ans2=tr[rs].a*x+tr[rs].mnb*y+tr[rs].c;
        if(ans1 > ans2){
            if(ans>ans1) return;
            fu_find(rt<<1,l,mid,x,y);
            if(ans < ans2) fu_find(rt<<1|1,mid+1,r,x,y);
        }
        else {
            if(ans>ans2) return;
            fu_find(rt<<1|1,mid+1,r,x,y);
            if(ans < ans1) fu_find(rt<<1,l,mid,x,y);
        }
    }
    int main(){
        //freopen("function.in","r",stdin);
        //freopen("function.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&g[i].a,&g[i].b,&g[i].c);
        bds(1,1,n);
        LL x;
        for(int i=1;i<=m;i++){
            scanf("%lld",&x);
            ans=-0x7fffffffffffffffLL;
            if(x>=0) zheng_find(1,1,n,x*x,x);
            else fu_find(1,1,n,x*x,x);
            printf("%lld
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    JDBC之Statement 接口的测试(存在sql注入风险)
    Java操作数据库之JDBC增删改查
    Java实体类之间的映射(一对多关系)
    Java实体类之间的映射(一对一关系)
    yield(放弃、谦逊、礼让)
    daemon(守护、服务员)-t1.setDaemon(true)
    join当前线程等待指定的线程结束后才能继续运行
    检查你要加入到gradle的第三方library是否是最新版本
    git 无法忽略Android Studio 生成的 .idea目录解决办法
    mybatis3 step by step 快速上手
  • 原文地址:https://www.cnblogs.com/FOXYY/p/7588226.html
Copyright © 2011-2022 走看看