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这个 ...
随机推荐
- 算法复习——拓展欧几里得(poj1061)
题目: Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很 ...
- 【扩展kmp+最小循环节】HDU 4333 Revolving Digits
http://acm.hdu.edu.cn/showproblem.php?pid=4333 [题意] 给定一个数字<=10^100000,每次将该数的第一位放到放到最后一位,求所有组成的不同的 ...
- hdu 2859
#include<stdio.h> char s[1010][1010]; int map[1010][1010]; int main() { int n,i,j,k,ii,jj; w ...
- NOIP 前夕 模板整理
归并排序: #include<iostream> #include<cstdio> #include<cstring> using namespace std; ] ...
- shell的select脚本的简单入门
shell的select脚本的简单入门 语法:select var in ...;do break;doneecho $var 示例: #/bin/bash echo "what is yo ...
- java通过反射获取bean字段注解@Column中的信息
直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...
- spark学习(二)
Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发. Spark和Hadoop有什么不同呢? Spark是基于map reduce算法实现的分布式计算,拥有Hadoop Ma ...
- org.apache.catalina.connector.ClientAbortException: java.io.IOException: APR error:-32
org.apache.catalina.connector.ClientAbortException: java.io.IOException: APR error:-32 Most likely, ...
- android EditText禁止复制粘贴完整代码
<!-- 定义基础布局LinearLayout --> <LinearLayout xmlns:android="http://schemas.android.com/ap ...
- CNN网络--AlexNet
ImageNet Classification with Deep Convolutional Neural Networks 从AlexNet剖析-卷积网络CNN的一般结构 AlexNet是Hint ...