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. 【2018.10.15】noip模拟赛Day1

    题面 wzj的题解 T1 随便搜 #include<bits/stdc++.h> #define ll long long using namespace std; inline int ...

  2. php 学习随笔

    ---恢复内容开始--- round进行格式化数值(进位规则遵守“四舍六入五双”,即前一位是奇数,则进一,前一位是偶数则舍入,因此,rount(1.5)=2,round(2.5)=2,round(0. ...

  3. hdu 2713

    #include<stdio.h> #include<string.h> int map[151000][2]; int max(int a,int b) {  return ...

  4. hdu 1104 数论+bfs

    Remainder Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  5. AC日记——小书童——刷题大军 洛谷 P1926

    题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人. 文言是火,点亮历史宫灯:历史是灯,照亮社会之路:社会是路,通向哲学大坑:哲学是坑,埋葬文科生 ...

  6. Activiti 5.17 实体对象与类和数据库表的映射

    一.Activiti 5.17 mybatis的mapping文件声明映射的实体对象关系. <configuration><settings><settingname=& ...

  7. 【paddle学习】词向量

    http://spaces.ac.cn/archives/4122/   关于词向量讲的很好 上边的形式表明,这是一个以2x6的one hot矩阵的为输入.中间层节点数为3的全连接神经网络层,但你看右 ...

  8. 使用UltraISO刻录自己的音乐CD步骤

    1.文件->新建->音乐光盘映像. 2.在左下方,“本地目录”中,找到音乐所在目录,右下方会出现mp3等音乐文件. 3.在右下方,点击音乐文件,右键选“添加”.音乐文件会出现在右上方窗口里 ...

  9. android 学习笔记四:控件

    1.android:gravity 指定控件的基本位置,比如居中.居右等位置 Top:顶部 bottom:底部 left:居左 right:居右 center_vertical:垂直居中 center ...

  10. 【转载】读懂IL代码就这么简单 (一)

    一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...