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 行,每行两个整数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 。