游戏通关

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 。

原文地址:https://www.cnblogs.com/lengsong/p/11268170.html