D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
2 seconds
256 megabytes
standard input
standard output
As you know, every birthday party has a cake! This time, Babaei is going to prepare the very special birthday party's cake.
Simple cake is a cylinder of some radius and height. The volume of the simple cake is equal to the volume of corresponding cylinder. Babaei has n simple cakes and he is going to make a special cake placing some cylinders on each other.
However, there are some additional culinary restrictions. The cakes are numbered in such a way that the cake number i can be placed only on the table or on some cake number j where j < i. Moreover, in order to impress friends Babaei will put the cake i on top of the cake j only if the volume of the cake i is strictly greater than the volume of the cake j.
Babaei wants to prepare a birthday cake that has a maximum possible total volume. Help him find this value.
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of simple cakes Babaei has.
Each of the following n lines contains two integers ri and hi (1 ≤ ri, hi ≤ 10 000), giving the radius and height of the i-th cake.
Print the maximum volume of the cake that Babaei can make. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.
Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if
.
2
100 30
40 10
942477.796077000
4
1 1
9 7
1 4
10 7
3983.539484752
In first sample, the optimal way is to choose the cake number 1.
In second sample, the way to get the maximum volume is to use cakes with indices 1, 2 and 4.
线段树维护比当前值a[i]小的最大dp[j]的值。j<i
我们可以用体积作为线段树的横坐标(就那个意思).
也可以直接上。(就是官方题解)
/* ***********************************************
Author :guanjun
Created Time :2016/2/24 9:56:13
File Name :cf343d.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 101000
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << ;
const double eps=1e-;
using namespace std;
priority_queue<int,vector<int>,greater<int> >pq;
struct Node{
int x,y;
};
struct cmp{
bool operator()(Node a,Node b){
if(a.x==b.x) return a.y> b.y;
return a.x>b.x;
}
}; bool cmp(int a,int b){
return a>b;
}
struct node{
ll Max;
int l,r;
int getmid(){return (l+r)/;}
}nod[maxn*];
void push_up(int i){
nod[i].Max=max(nod[i<<].Max,nod[i<<|].Max);
}
void build(int i,int l,int r){
nod[i].l=l,nod[i].r=r;
if(l==r){
nod[i].Max=; return ;
}
int mid=(l+r)/;
build(i<<,l,mid);
build(i<<|,mid+,r);
}
void update(int i,int k,ll w){
if(nod[i].l==k&&nod[i].r==k){
nod[i].Max=max(nod[i].Max,w);return ;
}
int mid=nod[i].getmid();
if(k<=mid)update(i<<,k,w);
else update(i<<|,k,w);
push_up(i);
}
double query(int i,int l,int r){
if(r<l)return ;
if(nod[i].l==l&&nod[i].r==r){
return nod[i].Max;
}
int mid=nod[i].getmid();
if(r<=mid)return query(i<<,l,r);
else if(l>mid)return query(i<<|,l,r);
else return max(query(i<<,l,mid),query(i<<|,mid+,r));
}
map<ll,int>mp;
ll a[maxn],b[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
int n;
while(cin>>n){
ll x,y;
mp.clear();
for(int i=;i<=n;i++){
cin>>x>>y;
b[i]=a[i]=x*x*y;
}
sort(b+,b++n);
int num=;
for(int i=;i<=n;i++){
if(!mp[b[i]])mp[b[i]]=++num;
}
build(,,n);
//puts("YEs");
for(int i=;i<=n;i++){
//cout<<mp[a[i]]<<endl;
ll dp=query(,,mp[a[i]]-)+a[i];
update(,mp[a[i]],dp);
}
printf("%.8lf\n",3.1415926*nod[].Max);
}
return ;
}
/* ***********************************************
Author :guanjun
Created Time :2016/2/23 21:49:30
File Name :cf343d.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 101100
#define cle(a) memset(a,0,sizeof(a))
#define X first
#define Y second
const ull inf = 1LL << ;
const double eps=1e-;
using namespace std;
priority_queue<int,vector<int>,greater<int> >pq;
pair<ll,int>a[maxn];
struct node{
int l,r;
ll Max;
}nod[maxn*]; void push_up(int i){
nod[i].Max=max(nod[i<<].Max,nod[i<<|].Max);
}
void build(int i,int l,int r){
nod[i].l=l;
nod[i].r=r;
if(l==r){
nod[i].Max=;
return ;
}
int mid=(l+r)/;
build(i<<,l,mid);
build(i<<|,mid+,r);
push_up(i);
}
void update(int i,int k,ll w){
if(nod[i].l==k&&nod[i].r==k){
nod[i].Max=max(nod[i].Max,w);
return ;
}
int mid=(nod[i].l+nod[i].r)/;
if(k<=mid)update(i<<,k,w);
else update(i<<|,k,w);
push_up(i);
}
double query(int i,int l,int r){
if(nod[i].l==l&&nod[i].r==r){
return nod[i].Max;
}
int mid=(nod[i].l+nod[i].r)/;
if(r<=mid)return query(i<<,l,r);
else if(l>mid)return query(i<<|,l,r);
else return max(query(i<<,l,mid),query(i<<|,mid+,r));
}
ll dp[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
int n;
while(cin>>n){
ll x,y;
for(int i=;i<=n;i++){
scanf("%I64d %I64d",&x,&y);
a[i].X=x*x*y;
a[i].Y=-i;
}
build(,,n);
sort(a+,a++n);
for(int i=;i<=n;i++){
int id=-a[i].Y;
//cout<<id<<endl;
dp[id]=query(,,id)+a[i].X; update(,id,dp[id]);
}
printf("%.8lf\n",nod[].Max*3.1415926);
}
return ;
}
注意id 赋值为-i。这样才能保证相同的体积出现时我们取最后那一个。这里不用-i也行,也可以自己写一个比较函数。
D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)的更多相关文章
- 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 ...
- Codeforces Round #343 (Div. 2)
居然补完了 组合 A - Far Relative’s Birthday Cake import java.util.*; import java.io.*; public class Main { ...
- Codeforces Round #343 (Div. 2) D - Babaei and Birthday Cake 线段树+DP
题意:做蛋糕,给出N个半径,和高的圆柱,要求后面的体积比前面大的可以堆在前一个的上面,求最大的体积和. 思路:首先离散化蛋糕体积,以蛋糕数量建树建树,每个节点维护最大值,也就是假如节点i放在最上层情况 ...
- Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake 水题
A. Far Relative's Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/A Description Do ...
- Codeforces Round #343 (Div. 2)-629A. Far Relative’s Birthday Cake 629B. Far Relative’s Problem
A. Far Relative's Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...
- Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake【暴力/组合数】
A. Far Relative’s Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...
- Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake
水题 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> ...
- Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp
C. Famil Door and Brackets 题目连接: http://www.codeforces.com/contest/629/problem/C Description As Fami ...
- Codeforces Round #343 (Div. 2) B. Far Relative’s Problem 暴力
B. Far Relative's Problem 题目连接: http://www.codeforces.com/contest/629/problem/B Description Famil Do ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads
题目链接: http://www.codeforces.com/contest/629/problem/E 题解: 树形dp. siz[x]为x这颗子树的节点个数(包括x自己) dep[x]表示x这个 ...
随机推荐
- ubuntu mysql安装及需要其他主机连服务器mysql时的设置(error:10061)
说明: 一个朋友在使用ubuntu-server 16.04安装mysql,设置远程访问的时候出现了问题,请我帮忙.但是,我也没有使用过ubuntu安装mysql,于是乎搜索了很多技术文件,比着葫芦画 ...
- 能量项链(codevs 1154)
题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子 ...
- Java 模板权重随机
Template templates=...// 所有的模板 final int _weights=1000; // 所有的模板权重 Template _template=null; //随机一个权重 ...
- Laravel 视图中的url
<a href="{{ url('url') }}">url</a> <a href="{{ action('StudentControll ...
- LayUI后台管理与综合示例
一.LayUI介绍 layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在,体 ...
- [转] Python 常用第三方模块 及PIL介绍
原文地址 除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在PyPI - the Python Package Index上注册,只要找到对应的模块名字,即可用pip ...
- Effective C++ Item 47 请使用 traits classes 表现类型信息
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:Traits classes 使得"类型相关信息"在编译期可用.它 ...
- 【转】 nginx rewrite 伪静态配置参数详细说明
nginx rewrite 伪静态配置参数和使用例子 附正则使用说明 正则表达式匹配,其中: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分 ...
- Android菜单menu控件大全
下载:http://www.see-source.com/androidwidget/list.html?type=16 Android-NewPopupMenu 使用PopupWindow实现的Po ...
- github 新建远程仓库 及 删除远程仓库
一.新建远程仓库 1.点击 ' + ' 号 2.选择 ' new repository ' 3.填写信息 创建仓库 二.删除远程仓库 1.点击 ' Settings ' 按钮 2.滑动到最底部,点击 ...