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. spring之Autowire

    当使用spring为一个对象的属性注入时,通常使用xml文件的property元素和ref属性,但是我们也可以使用spring中的autowire进行注入 使用方法如下 <bean id=&qu ...

  2. Linux(10):期中架构(2)--- NFS存储服务 & 实时同步

    1. 共享存储服务概念: # NFS是Network File System的缩写,中文意思是网络文件系统, # 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. 2. ...

  3. uva 11235 RMQ范围最大值

    题目大意:给一个整数上升序列,对于一系列询问区间(i,j),回答这段区间出现次数最多值所出现的次数. 分析:一个上升序列,相同的值聚集在一起,把相同的值的区间看作一个整体,假设这样的整体有n个,把他们 ...

  4. 王室联邦(bzoj 1086)

    Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不 ...

  5. MongoDB_java连接MongoDB

    java程序连接单机版的mongodb: 参考:http://www.runoob.com/mongodb/mongodb-java.html https://www.yiibai.com/mongo ...

  6. msp430项目编程33

    msp430中项目---简易示波器系统 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  7. centos 7 配置多个IP地址

    centos 7 配置多个IP地址 #打开网络配置文件 cd /etc/sysconfig/network-scripts/ vim ifcfg-eno167 找到IPADDR的位置,在下面再增加需要 ...

  8. 让Mac OS X下的终端像Linux那样拥有丰富多彩的颜色显示

    我们知道Linux下的命令行终端具有颜色回显功能,用ls命令查看目录或者文件,终端会以不同的颜色来区分:使用vim命令行编辑器打开脚本或其他源程序代码会以语法高亮模式显示.而Mac OS X下的终端却 ...

  9. web信息搜索之目标扫描篇

    https://blog.csdn.net/dongfei2033/article/details/78175421

  10. (7)C#连DB2---oledb方式

    1安装客户端 安装DbVisualizer Free 客户端软件 2编目 用 win+r  输入 db2cmd 启动命令行 要远程操作数据库,首先要进行编目,分三个步骤: 1. 在客户端建立服务器端数 ...