题目链接 Hanoi Factory

很容易想到这是一个DAG模型,那么状态转移方程就出来了。

但是排序的时候有个小细节:b相同时看a的值。

因为按照惯例,堆塔的时候肯定是内半径大的在下面。

因为N有1e5,那么DP的时候用线段树优化一下,就可以了。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)              for(int i(a); i <= (b); ++i)

typedef long long LL;

const int N     =    200000      +       10;

struct Segtree{
int l, r;
LL num;
} segtree[N << 2]; struct node{
int a, b;
LL h;
friend bool operator < (const node &A, const node &B){
return A.b == B.b ? A.a > B.a : A.b > B.b;
}
} c[N]; struct Node{
int x, y;
friend bool operator < (const Node &a, const Node &b){
return a.x < b.x;
}
} f[N]; int aa[N], bb[N];
int n, m, cnt;
map <int, int> mp;
LL ans; inline void pushup(int i){
segtree[i].num = max(segtree[i << 1].num, segtree[i << 1 | 1].num);
} void build(int i, int l, int r){ segtree[i].l = l;
segtree[i].r = r;
segtree[i].num = 0; if (l == r) return ;
int mid = (l + r) >> 1;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
} void update(int i, int pos, LL value){
int L = segtree[i].l, R = segtree[i].r;
if (L == R && L == pos){
segtree[i].num = max(segtree[i].num, value);
return;
} int mid = L + R >> 1;
if (pos <= mid) update(i << 1, pos, value);
else update(i << 1 | 1, pos, value); pushup(i);
} LL query(int i, int l, int r){
int L = segtree[i].l, R = segtree[i].r;
if (L == l && R == r) return segtree[i].num;
int mid = L + R >> 1;
LL ret = 0;
if (r <= mid)
ret = max(ret, query(i << 1, l, r));
else
if (l > mid)
ret = max(ret, query(i << 1 | 1, l, r));
else
{
ret = max(ret, query(i << 1, l, mid));
ret = max(ret, query(i << 1 | 1, mid + 1, r));
} return ret;
} int main(){ scanf("%d", &n);
cnt = 0;
rep(i, 1, n){
scanf("%d%d%lld", aa + i, bb + i, &c[i].h);
f[++cnt].x = aa[i];
f[++cnt].x = bb[i];
} sort(f + 1, f + cnt + 1); f[1].y = 1;
rep(i, 2, cnt) f[i].y = f[i].x == f[i - 1].x ? f[i - 1].y : f[i - 1].y + 1;
rep(i, 1, cnt) mp[f[i].x] = f[i].y; rep(i, 1, n){
c[i].a = mp[aa[i]];
c[i].b = mp[bb[i]];
} sort(c + 1, c + n + 1); m = 0;
rep(i, 1, n){
m = max(m, c[i].a);
m = max(m, c[i].b);
} build(1, 1, m); rep(i, 1, n){
LL now = query(1, 1, c[i].b - 1);
LL cnt = now + c[i].h;
ans = max(ans, cnt);
update(1, c[i].a, cnt);
} printf("%lld\n", ans); return 0; }

Codeforces 777E Hanoi Factory(线段树维护DP)的更多相关文章

  1. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  2. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  3. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp

    D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...

  4. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  5. 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】

    题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...

  6. 2019牛客暑期多校训练营(第二场)E 线段树维护dp转移矩阵

    题意 给一个\(n\times m\)的01矩阵,1代表有墙,否则没有,每一步可以从\(b[i][j]\)走到\(b[i+1][j]\),\(b[i][j-1]\),\(b[i][j+1]\),有两种 ...

  7. Codeforces750E. New Year and Old Subsequence (线段树维护DP)

    题意:长为2e5的数字串 每次询问一个区间 求删掉最少几个字符使得区间有2017子序列 没有2016子序列 不合法输出-1 题解:dp i,p(0-4)表示第i个数匹配到2017的p位置删掉的最少数 ...

  8. CodeForces833 B. The Bakery 线段树维护dp

    题目链接:https://vjudge.net/problem/CodeForces-833B 题意:给长度为n的数组a,和一个整数k要求把数组分成连续的k段,每段的权值是该段中不同数的个数,输出最大 ...

  9. hdu4719 Oh My Holy FFF 线段树维护dp

    题意:给你一个长度为n的数组v,你需要把这个数组分成很多段,你需要保证每一段的长度不能超过k我们设一共有m段,每一段右边界那个数为bi那么我们要使得sum(bi*bi-b(i-1))最大 (1< ...

随机推荐

  1. java十分钟速懂知识点——System类

    上次面试中遇到的一个问题,问到System.out.println()中的out是不是内部类,当时就给问蒙了,直观感觉out应该是System类的一个属性,跟内部类有什么关系?而且之前整理IO部分的时 ...

  2. redis 之相关命令

    为什么缓存数据库更要首选redis?如何使用redis? 一.使用缓存数据库为什么首选用redis? 我们都知道,把一些热数据存到缓存中可以极大的提高速度,那么问题来了,是用Redis好还是Memca ...

  3. service-worker实践

    service-worker虽然已列入标准,但是支持的浏览器还是有限制,还有比较多的问题. 1. 生命周期 注册成功-------installing--------------> 安装成功(i ...

  4. WebApi 跨域

    http://www.cnblogs.com/lori/p/3557111.html http://bbs.csdn.net/topics/391020576

  5. cookie注意事项

    cookie是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式. 四种会话跟踪技术(URL重写.隐藏表单域.Cookie.Session) 服务端技术:URL重写,Session, ...

  6. Wordpress 文章添加副标题

    后台编辑区添加自定义副标题字段 /** * Add Subtitle in all post */ function article_subtitle( $post ) { if ( ! in_arr ...

  7. Visual C++斗地主游戏网络版源代码

    说明:VC++ 6.0写的网络版斗地主游戏,程序基于directx SDK开发,因此你在编译时需要引入相应文件才可以,本斗地主可以支持双人对战.网络对战,游戏随机产生地主,动画发牌,界面也不错,还有声 ...

  8. mojoportal在IE10中点击ImageButton出错的处理方法

    在ie10中,如果点击了mojoportal中的imagebutton,会出现错误,在ie10之前的浏览器,及ie10的兼容模式中及谷歌浏览器中都不会出现. 日志中 错误信息如下: 2013-09-2 ...

  9. java 课堂笔记

  10. application.properties 详解

    mvc spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体实现的超时时间为准,比如tomcat的servlet3的话是 ...