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


    题目链接: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
    ",ans);
    39     return 0;
    40 }
    View Code
  • 相关阅读:
    解决“ 故障模块名称: clr.dll ”
    关于阿里云专有网络搭建FTP服务器的深坑
    电脑异常断电,IDEA崩溃
    Winform 出现“Win已停止工作”解决方法
    C# WinForm控件、自定义控件整理(大全)
    cmd获取管理员权限等
    检测笔记本电池状态
    单片机
    常用工具、焊接技术
    元器件
  • 原文地址:https://www.cnblogs.com/bin-gege/p/6443923.html
Copyright © 2020-2023  润新知