码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #401 (Div. 2) E. Hanoi Factory

时间:2017-02-26 12:03:07      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:排序   最大   树状   name   lin   using   blank   print   lan   

题目链接:Codeforces Round #401 (Div. 2) E. Hanoi Factory

题意:

给你n个环,每个环有内径a,外径b,高度v,现在让你将这n个环重起来,问你能重的最大高度。

满足条件:bi>=bj,bj>ai。(i<j)

题解:

首先将所以数据离散化,然后我们先按b从大到小排序,以a为第二关键字。

这里有一个贪心的思想,就是b相同时,a越小的放上面,这样可以重更多。

然后用树状数组维护一下放当前环的最大值,更新一下答案就行。

这题也可以直接cdq分治,不过一般都是三维的时候才加。

技术分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int N=1e5+7;
 7 struct node
 8 {
 9     int x,y,v;
10     bool operator <(const node &b)const{return y==b.y?x>b.x:y>b.y;}
11 }a[N];
12 
13 int n,hsh[N*2],ed,h_ed;
14 ll mx[N*2];
15 
16 inline void up(ll &a,ll b){if(a<b)a=b;}
17 void add(int x,ll c){while(x<=h_ed)up(mx[x],c),x+=x&-x;}
18 ll ask(int x){ll an=0;while(x)up(an,mx[x]),x-=x&-x;return an;}
19 int getid(int x){return lower_bound(hsh+1,hsh+1+h_ed,x)-hsh;}
20 
21 int main(){
22     scanf("%d",&n);
23     F(i,1,n)
24     {
25         scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
26         hsh[++ed]=a[i].x,hsh[++ed]=a[i].y;
27     }
28     sort(hsh+1,hsh+1+ed);
29     h_ed=unique(hsh+1,hsh+1+ed)-hsh-1;
30     sort(a+1,a+1+n);
31     ll ans=0;
32     F(i,1,n)
33     {
34         ll tmp=ask(getid(a[i].y)-1);
35         up(ans,tmp+a[i].v);
36         add(getid(a[i].x),tmp+a[i].v);
37     }
38     printf("%lld\n",ans);
39     return 0;
40 }
View Code

 

Codeforces Round #401 (Div. 2) E. Hanoi Factory

标签:排序   最大   树状   name   lin   using   blank   print   lan   

原文地址:http://www.cnblogs.com/bin-gege/p/6443923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!