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\n",sum);
return 0;
}
提交数: 170 通过数: 52
【题目描述】
XY在玩一个包含NN 个任务的游戏。每个任务完成时限为TiTi (你可以认为还没开始做任务时的时间为00 ),奖励为WiWi 。由于XY技术的娴熟以及任务的简单,对于每个任务,他都可以在一个单位时间内完成。
XY想要知道他能够获得的最多的奖励。
【输入】
第一行一个整数NN ,表示需要完成的任务数目。
接下来NN 行,每行两个整数T、WT、W ,分别表示完成这个任务的最后期限和完成这个任务后获得的奖励。
【输出】
输出数据有且仅有一行,只包含一个整数,表示最多获得的奖励。
【输入样例】
2 1 5 1 4
【输出样例】
5
【提示】
【样例输入2】
5 2 3 1 2 4 5 1 3 3 4
【样例输出2】
15
【样例解释2】
对于样例2,XY可以选择完成任务1、3、41、3、4 和55 ,这样他可以获得奖励1515 。
【数据规模及约定】
对于10%的数据,N≤100,Ti≤100,Wi≤2000N≤100,Ti≤100,Wi≤2000 。
对于30%的数据,N≤1000,Ti≤5000,Wi≤2000N≤1000,Ti≤5000,Wi≤2000 。
对于50%的数据,N≤10000,Ti≤20000,Wi≤2000N≤10000,Ti≤20000,Wi≤2000 。
对于100%的数据,N≤200000,Ti≤200000,Wi≤2000N≤200000,Ti≤200000,Wi≤2000 。