zoukankan      html  css  js  c++  java
  • 湫湫系列故事——消灭兔子

    线段树维护区间最小值, 简单记录下, 下标写错啦, WA到死。

    http://acm.hdu.edu.cn/showproblem.php?pid=4544

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    int f_min(int x,int y) {return x>y?y:x;}
    int f_max(int x,int y) {return x>y?x:y;}
    int f_abs(int x) {return x>0?x:(-x);}
    using namespace std;
    
    const int MM = 100011;
    #define maxint 10000000
    #define debug puts("wrong");
    typedef __int64 int64;
    //const __int64 maxint = 1000000000000;
    #define lson rt<<1
    #define rson rt<<1|1
    
    int64 N,M;
    
    struct Info {
        int64 val;
        int64 need;
        int64 id;
    }p[MM];
    
    Info sum[MM<<2];
    
    
    bool cmp(Info x,Info y) {
        if(x.val!=y.val) return x.val<y.val;
        else return x.need<y.need;
    }
    int64 B[MM];
    
    void get_data() {
        int64 i,j,k;
        for(i=1;i<=N;i++) scanf("%I64d",&B[i]);
        for(i=1;i<=M;i++) scanf("%I64d",&p[i].val);
        for(i=1;i<=M;i++) {
            scanf("%I64d",&p[i].need);
        }
        sort(B+1,B+N+1);
        sort(p+1,p+M+1,cmp);
     //   for(i=1;i<=M;i++) printf("%I64d ",p[i].need); printf("\n");
    }
    int64 find(int64 x) {
        int64 l=1,r=M;
        while(l<=r) {
            int64 mid=(l+r)>>1;
            if(p[mid].val>=x) r=mid-1;
            else l=mid+1;
        }
        return l;
    }
    void push_up(int64 rt) {
        if(sum[lson].need>sum[rson].need) sum[rt]=sum[rson];
        else sum[rt]=sum[lson];
    }
    
    void build(int64 l,int64 r,int64 rt) {
        if(l==r) {
            sum[rt]=p[l];
            sum[rt].id=l;
            return;
        }
        int64 mid=(l+r)>>1;
        build(l,mid,lson);
        build(mid+1,r,rson);
        push_up(rt);
    }
    void tran(int64 l,int64 r,int64 rt) {
        printf("%I64d %I64d %I64d\n",l,rt,sum[rt].need); 
        if(l==r) {return;}
        int64 mid=(l+r)>>1;
        tran(l,mid,lson);
        tran(mid+1,r,rson);
    }
    Info query(int64 L,int64 R,int64 l,int64 r,int64 rt) {
        if(L<=l && r<=R) {
            return sum[rt];
        }
        int64 mid=(l+r)>>1;
        Info ret,tmp;  ret.need=maxint; //ret.val=maxint; ret.id=-1;
        if(L<=mid) {
            tmp=query(L,R,l,mid,lson);
            if(ret.need>tmp.need) ret=tmp;
        }
        if(R>mid) {
            tmp=query(L,R,mid+1,r,rson);
            if(ret.need>tmp.need) ret=tmp;
        }
        return ret;
    }
    
    void Update(int64 p,int64 l,int64 r,int64 rt) {
        if(l==r) {
            sum[rt].need=maxint;
            return;
        }
        int64 mid=(l+r)>>1;
        if(p<=mid) Update(p,l,mid,lson);
        else Update(p,mid+1,r,rson);
        push_up(rt);
    }
    
    void solve() {
        int64 i,j,k,tmp,id;
        Info mx;
        int64 ans=0;
        bool flag=true;
        build(1,M,1);
    //    tran(1,M,1);
        tmp=M;
        for(i=N;i>=1;i--) {
    //        tmp=find(B[i]);
            while(tmp>=1 && p[tmp].val>=B[i]) tmp--;
    //        printf("%d***\n", tmp);
    
            mx=query(tmp+1,M,1,M,1);
            
     //        printf("%I64d %I64d %I64d %I64d\n",B[i], tmp,mx.need,mx.val);
    //        printf("%d\n",sum[1].need);
            
     //       if(B[i]==4) tran(1,M,1); 
            if(mx.need==maxint) {flag=false;break;}
            else     ans+=mx.need;  
            Update(mx.id,1,M,1);
    
        }
        if(!flag) puts("No");
        else printf("%I64d\n", ans);
    }
    
    int main() {
        while(scanf("%I64d%I64d",&N,&M)!=EOF) get_data(),solve();
        return 0;
    }
    /*
    5 5
    1 23 54 4 3
    12 32 3 54 34
    12 32 43 54 65
    206
    */
  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/zhang1107/p/2992576.html
Copyright © 2011-2022 走看看