zoukankan      html  css  js  c++  java
  • 游戏通关

    1672:游戏通关


    时间限制: 1000 ms         内存限制: 262144 KB
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5;
    
    struct node{
        int poi,cost;
    };
    struct node2{
        int left,right,Max;
    };
    bool operator<(node a,node b){
        return a.cost<b.cost;
    }
    priority_queue<node>que;
    node2 fa[4*maxn+5];
    
    void build(int num,int l,int r){
        fa[num].left=l,fa[num].right=r;
        if(l>=r){
            fa[num].Max=l;
            return;
        }
        int mid=(l+r)/2;
        build(num*2,l,mid);
        build(num*2+1,mid+1,r);
        fa[num].Max=max(fa[num*2].Max,fa[num*2+1].Max);
    }
    void change(int p,int x){
        if(fa[p].left==fa[p].right){
            fa[p].Max=0;
            return;
        }
        int mid=(fa[p].left+fa[p].right)/2;
        if(x<=mid)change(p*2,x);
        else change(p*2+1,x);
        fa[p].Max=max(fa[p*2].Max,fa[p*2+1].Max);
    }
    int ask(int p,int l,int r){
        if(l<=fa[p].left&&r>=fa[p].right)return fa[p].Max;
        int mid=(fa[p].left+fa[p].right)/2;
        int val=0;
        if(l<=mid)val=ask(p*2,l,r);
        if(r>mid)val=max(val,ask(p*2+1,l,r));
        return val;
    }
    int main(){
        build(1,1,maxn);
        int n,a,b,sum=0;
        scanf("%d",&n);
        node temp;
        for(register int i=1; i<=n; ++i){
            scanf("%d %d",&a,&b);
            temp.poi=a,temp.cost=b;
            que.push(temp);
        }
        while(!que.empty()){
            temp=que.top();
            que.pop();
            int x=temp.poi;
            int place=ask(1,1,x);
            if(place>0){
                sum+=temp.cost;
                change(1,place);
            }
        }
        printf("%d
    ",sum);
        return 0;
    }
    

      

    提交数: 170     通过数: 52

    【题目描述】

    XY在玩一个包含NN 个任务的游戏。每个任务完成时限为TiTi (你可以认为还没开始做任务时的时间为00 ),奖励为WiWi 。由于XY技术的娴熟以及任务的简单,对于每个任务,他都可以在一个单位时间内完成。

    XY想要知道他能够获得的最多的奖励。

    【输入】

    第一行一个整数NN ,表示需要完成的任务数目。

    接下来NN 行,每行两个整数TWT、W ,分别表示完成这个任务的最后期限和完成这个任务后获得的奖励。

    【输出】

    输出数据有且仅有一行,只包含一个整数,表示最多获得的奖励。

    【输入样例】

    2
    1 5
    1 4
    

    【输出样例】

    5

    【提示】

    【样例输入2】

    5
    2 3
    1 2
    4 5
    1 3
    3 4

    【样例输出2】

    15

    【样例解释2】

    对于样例2,XY可以选择完成任务1341、3、4 和55 ,这样他可以获得奖励1515 。

    【数据规模及约定】

    对于10%的数据,N100Ti100Wi2000N≤100,Ti≤100,Wi≤2000 。

    对于30%的数据,N1000Ti5000Wi2000N≤1000,Ti≤5000,Wi≤2000 。

    对于50%的数据,N10000Ti20000Wi2000N≤10000,Ti≤20000,Wi≤2000 。

    对于100%的数据,N200000Ti200000Wi2000N≤200000,Ti≤200000,Wi≤2000 。

  • 相关阅读:
    mingw-gcc-9.0.1-i686-posix-sjlj-201903
    MSYS 编译 nginx rtmp-module
    MinGW GCC 8.3.1 2019年2月23日 出炉啦
    城市区号SQL
    HCN网络技术实验指南2
    HCN网络技术实验指南1
    CCNA实验攻略1:配置Cisco交换机
    HCDA-7-配置ssh远程管理
    HCDA-6-配置telnet远程管理
    4.1 子网划分基础
  • 原文地址:https://www.cnblogs.com/lengsong/p/11268170.html
Copyright © 2011-2022 走看看