D. Babaei and Birthday Cake
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

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.

Input

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.

Output

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 .

Examples
input
2
100 30
40 10
output
942477.796077000
input
4
1 1
9 7
1 4
10 7
output
3983.539484752
Note

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)的更多相关文章

  1. 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 ...

  2. Codeforces Round #343 (Div. 2)

    居然补完了 组合 A - Far Relative’s Birthday Cake import java.util.*; import java.io.*; public class Main { ...

  3. Codeforces Round #343 (Div. 2) D - Babaei and Birthday Cake 线段树+DP

    题意:做蛋糕,给出N个半径,和高的圆柱,要求后面的体积比前面大的可以堆在前一个的上面,求最大的体积和. 思路:首先离散化蛋糕体积,以蛋糕数量建树建树,每个节点维护最大值,也就是假如节点i放在最上层情况 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake

    水题 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> ...

  8. 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 ...

  9. 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 ...

  10. 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这个 ...

随机推荐

  1. mongodb的安装及环境配置

    一 下载 官网:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.6.3-signed.msi 官网可能打不开, ...

  2. uva 1426 离散平方根

    1426 - Discrete Square Roots Time limit: 3.000 seconds A square root of a number x <tex2html_verb ...

  3. Longge的问题(bzoj 2705)

    Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). Input 一 ...

  4. gdbt原理解析

    链接: http://note.youdao.com/noteshare?id=aeb1c7a30c5f4b70e3fff51f28ee5c47 懒得复制到这里了,一开始是在有道云笔记上写的,这里的公 ...

  5. TortoiseSVN如何更换或重置登录用户

    昨天手贱把svn重新卸载了,再安装后便与之前的项目断了,因为第一次使用这个,也不清楚再怎么登录,还有就是上次是使用别人的账号,也不知道怎么清除别人的账号. 鼠标右键找到settings,点击打开 找到 ...

  6. 洛谷 P2831 愤怒的小鸟

    P2831 愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0)(0,0) 处,每次 Kiana 可以用它向第一象 ...

  7. JS---数组(Array)处理函数整理

    1.concat() 连接两个或更多的数组该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.例如: 代码如下: <script type="text/javascript&q ...

  8. 初探STL之算法

    算法 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包括头文件<algor ...

  9. shell 检查文件夹所属用户组

    shell 检查文件夹所属用户组 #!/bin/bash # 检查文件夹 权限是否777 检查文件夹所属组是否www # authro ranmufei # 2017 08 21 云板容器版 /dat ...

  10. docker (2)---存储、网络(利用docker容器上线静态网站)

    一.docker底层依赖的核心技术 1.命名空间 (Namespaces) 2.控制组 (Control Groups) 3.联合文件系统 (Union File System) 4.Linux 虚拟 ...