题目链接 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. [BZOJ1208]宠物收养所(Splay)

    Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...

  2. SQL中的函数用法

    一.coalesce COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值.如果所有的表 ...

  3. 11,scrapy框架持久化存储

    今日总结 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  4. HDU 5657 CA Loves Math 状压DP + 枚举

    题意: 给出\(A(2 \leq A \leq 11), n(0 \leq n \leq 10^9), k(1 \leq k \leq 10^9)\). 求区间\([1, A^n]\)中各个数字互不相 ...

  5. SpringMvc路径参数和url的两种实现方式

    我们经常采用的SpringMvc路径参数经常的操作是在url后面采用?参数名=值1&参数名2=值2这种方式实现 RequestMapping的作用: 1)当作用在controller时,我们通 ...

  6. 分分钟教你做出自己的新闻阅读APP

    分分钟教你做出自己的新闻阅读APP 引子 曾经不小心发现了一些好的看新闻的网站,但是电脑又不是随身携带,因此想要下载一个这个网站的手机APP来看新闻,但是问题来了,这个网站根本没有做Android端! ...

  7. Marketing learning-3

    Part five brand mantra: the elevator speed 1.mental map:Portrays brand associations and responses fo ...

  8. Leetcode 640.求解方程

    求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回"No so ...

  9. Jquery版放大镜效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Linux常用命令与基本概念

    复制 文件的复制 cp 源文件 目标文件 文件夹的复制 cp -r 源文件夹 目标文件夹 删除 删除文件 rm 文件名 删除文件夹 rm -rf 文件夹 查看文件类型 file 文件名 压缩与解压 z ...