D. Babaei and Birthday Cake---cf629D(LIS线段树优化)
题目链接:http://codeforces.com/problemset/problem/629/D
题意就是现有n个蛋糕,蛋糕的形状是圆柱体,每个蛋糕的体积就是圆柱体的体积,每个蛋糕的编号是1---n,可以把蛋糕 i 放到蛋糕 j 上面,前提是 j<i 并且 Vj<Vi;最后求最大的体积是多少;
实质就是求上升子序列的最大和,但是由于n的范围是10w所以不能用n^2的复杂度,所以可以用线段树进行优化,时间复杂度变为nlogn;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
#define PI 4*atan(1.0)
#define N 302000
#define met(a, b) memset(a, b, sizeof(a)) #define Lson r<<1
#define Rson r<<1|1 double v[N], b[N]; struct node
{
int L, R;
double Max;///表示这个区间内的最大值,
int Mid(){ return (L+R)/; }
}a[N*]; void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R;a[r].Max = ;
if(L == R)return;
Build(Lson, L, a[r].Mid());
Build(Rson, a[r].Mid()+, R);
} double Query(int r, int L, int R)
{
if(L > R) return ; if(a[r].L == L && a[r].R == R)
return a[r].Max; if(R <= a[r].Mid())
return Query(Lson, L, R);
else if(L > a[r].Mid())
return Query(Rson, L, R);
else
{
double ans1 = Query(Lson, L, a[r].Mid());
double ans2 = Query(Rson, a[r].Mid()+, R);
return max(ans1, ans2);
}
} void Update(int r, int pos, double num)
{
if(a[r].L == a[r].R && a[r].L == pos)
{
a[r].Max = num;
return ;
}
if(pos <= a[r].Mid())
Update(Lson, pos, num);
else
Update(Rson, pos, num); a[r].Max = max(a[Lson].Max, a[Rson].Max);
} int main()
{
int n;
LL r, h;
while(scanf("%d", &n)!=EOF)
{
for(int i=; i<=n; i++)
{
scanf("%I64d %I64d", &r, &h);
v[i] = b[i] = PI*h*r*r;
}
sort(b, b+n);
int len = unique(b, b+n) - b; Build(, , len); double ans = ;
for(int i=; i<=n; i++)
{
int pos = lower_bound(b, b+len, v[i]) - b;///每次找到当前这个数能放的位置;
double res = Query(, , pos-) + v[i];///找到这个位置之前的最大值
Update(, pos, res);///找到之后把这个值加到那个位置上
ans = max(ans, res);
}
printf("%.12f\n", ans);
}
return ;
}
D. Babaei and Birthday Cake---cf629D(LIS线段树优化)的更多相关文章
- SGU 521 North-East ( 二维LIS 线段树优化 )
521. "North-East" Time limit per test: 0.5 second(s)Memory limit: 262144 kilobytes input: ...
- D. Babaei and Birthday Cake---cf629D(最长上升子序列和+线段树优化)
http://codeforces.com/problemset/problem/629/D 题目大意: 我第一反应就是求最长上升子序列和 但是数值太大了 不能直接dp求 可以用线段树优化一下 ...
- UVA-1322 Minimizing Maximizer (DP+线段树优化)
题目大意:给一个长度为n的区间,m条线段序列,找出这个序列的一个最短子序列,使得区间完全被覆盖. 题目分析:这道题不难想,定义状态dp(i)表示用前 i 条线段覆盖区间1~第 i 线段的右端点需要的最 ...
- Codeforces Round #426 (Div. 2) D 线段树优化dp
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- CodeForces 834D The Bakery(线段树优化DP)
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...
- [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)
题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...
- Weak Pair---hud5877大连网选(线段树优化+dfs)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 题意:给你一颗树,有n个节点,每个节点都有一个权值v[i]:现在求有多少对(u,v ...
- CodeForces 558E(计数排序+线段树优化)
题意:一个长度为n的字符串(只包含26个小字母)有q次操作 对于每次操作 给一个区间 和k k为1把该区间的字符不降序排序 k为0把该区间的字符不升序排序 求q次操作后所得字符串 思路: 该题数据规模 ...
- HDU4719-Oh My Holy FFF(DP线段树优化)
Oh My Holy FFF Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) T ...
随机推荐
- 【从0開始Tornado建站】整体设计
Tornado是一个非堵塞的webserver,也是python的web框架中很优秀的一款.网上关于django的tutorial许多并且具体,关于tornado的使用就很少了.我想以我从0開始的方式 ...
- Swift数值运算
Swift 让全部数值类型都支持了主要的四则运算: 加法(+) 减法(-) 乘法(*) 除法(/) 1 + 2 // 等于 3 5 - 3 // 等于 2 2 * 3 // 等于 6 10.0 / 2 ...
- RSQLite 操作sqlite数据库
RSQLite 可以在R中方便的创建sqlite数据库,并进行检索, 这个R包依赖于DBI包 github 上的地址:https://github.com/rstats-db/RSQLite gith ...
- Unity中坐标系转换方法
前言 本篇文章主要是参考<Unity API 解析>---陈泉宏. 这是本人在学校图书馆找到一本书,主要介绍的就是常用的类,比较实用,没有冗余的地方.在此推荐一下这本书! 一.Screen ...
- 【Java面试题】24 sleep() 和 wait() 有什么区别? 详细解析!!!!
第一种解释: 功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩. 还有用法的上的不同是:sleep(milliseconds)可 ...
- spring如何引用properties文件里的配置
1.PropertyPlaceholderConfigurer类它是把属性中的定义的变量(var)替代,spring的配置文件中使用${var}的占位符 <beans><bean ...
- javaScript实现归并排序
归并排序是一个O(nlogn)的算法,其基本思想就是一个分治的策略,先进行划分,然后再进行合并,下面举个例子.有这样一组数据: {5,4,1,22,12,32,45,21} 如果对它进行归并排序的话, ...
- phpcms v9如何更改分页显示条数?
默认显示页码数有10条,比如想更改成显示3条,例如这样 上一页 1 2 3...34 下一页 更改phpcms\libs\functions\global.func.php,找到分页函数,大概在665 ...
- ubuntu 使用蓝牙和minicom
Ubuntu本身一般都带了USB转串口的驱动. 1. 首先确认系统支持USBSerial,输入以下命令: lsmod | grep usbserial 2. 接上USB串口线,看看系统是否可 ...
- UVa 10450 - World Cup Noise
题目:构造一个01串,使得当中的1不相邻,问长度为n的串有多少中. 分析:数学,递推数列. 设长度为n的串有n个.则有递推关系:f(n)= f(n-1)+ f(n-2): 长度为n的结束可能是0或者1 ...