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
    */
  • 相关阅读:
    jQuery插件jTemplates(模板)
    js常用正则
    SQLServer笔记 //20111027
    神经网络感知器matlab实现
    求全排列(无重复字母)
    python 学习笔记(1、数据类型)
    WampServer 不能打开phpmyadmin 的解决办法
    求一个整形数组里子序列和最大的算法
    堆排序算法的实习(C++)
    归并排序
  • 原文地址:https://www.cnblogs.com/zhang1107/p/2992576.html
Copyright © 2011-2022 走看看