http://codeforces.com/problemset/problem/629/D

题目大意: 我第一反应就是求最长上升子序列和  但是数值太大了  不能直接dp求  可以用线段树优化一下

#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm> using namespace std;
const long long INF = (1LL << );
#define inf 0x3f3f3f3f #define met(a,b) memset(a,b,sizeof(a))
#define N 1005000
const double pi = acos(-1.0);
#define Lson r<<1|1
#define Rson r<<1 double s[N],b[N]; struct node
{
int L,R;
double Max;
int mid()
{
return (L+R)/;
}
}a[N*]; void BuildTree(int r,int L,int R)
{
a[r].L=L;
a[r].R=R;
a[r].Max=;
if(L==R)
return ;
BuildTree(Lson,L,a[r].mid());
BuildTree(Rson,a[r].mid()+,R);
} double Qurry(int r,int L,int R)
{
if(L>R)
return ;
if(a[r].L == L && a[r].R==R)
{
return a[r].Max;
} if(L>a[r].mid())
return Qurry(Rson,L,R);
else if(R<=a[r].mid())
return Qurry(Lson,L,R);
else
{
double m1=Qurry(Lson,L,a[r].mid());
double m2=Qurry(Rson,a[r].mid()+,R);
return max(m1,m2);
}
} void Update(int r,int L,double ans)
{
if(a[r].L==a[r].R && a[r].L==L)
{
a[r].Max=ans;
return;
} if(L>a[r].mid())
Update(Rson,L,ans);
else
Update(Lson,L,ans); a[r].Max=max(a[Lson].Max,a[Rson].Max);
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
double r,h;
met(b,);
met(s,);
for(int i=;i<n;i++)
{
scanf("%lf %lf",&r,&h);
s[i]=b[i]=pi*r*r*h;
}
sort(b,b+n);
int len=unique(b,b+n)-b; BuildTree(,,len-); double sum=;
for(int i=;i<n;i++)
{
int pos=lower_bound(b,b+len,s[i])-b;///找到所在的下标
double ans=Qurry(,,pos-)+s[i];///查找之前的最大值
Update(,pos,ans);///更新点
sum=max(sum,ans);
}
printf("%.12lf\n",sum);
}
return ;
}

D. Babaei and Birthday Cake---cf629D(最长上升子序列和+线段树优化)的更多相关文章

  1. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  2. HDU 1025-Constructing Roads In JGShining's Kingdom(最长不降子序列,线段树优化)

    分析: 最长不降子序列,n很大o(n^2)肯定超,想到了小明序列那个题用线段树维护前面的最大值即可 该题也可用二分搜索来做. 注意问题输出时的坑,路复数后加s #include <map> ...

  3. CF 150E Freezing with Style [长链剖分,线段树]

    \(sol:\) 给一种大常数 \(n \log^2 n\) 的做法 考虑二分,由于是中位数,我们就二分这个中位数,\(x>=mid\)则设为 \(1\),否则为 \(-1\) 所以我们只需要找 ...

  4. Codeforces 629D Babaei and Birthday Cake(线段树优化dp)

    题意: n个蛋糕编号从小到大编号,j号蛋糕可以放在i号上面,当且仅当j的体积严格大于i且i<j,问最终可得的最大蛋糕体积. 分析: 实质为求最长上升子序列问题,设dp[i]从头开始到第i位的最长 ...

  5. 题目1533:最长上升子序列 (nlogn | 树状数组)

    题目1533:最长上升子序列 http://ac.jobdu.com/problem.php?pid=1533 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:857 解决:178 题目描 ...

  6. bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...

  7. Codeforces 527C Glass Carving (最长连续0变形+线段树)

    Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glas ...

  8. 最长不下降子序列(线段树优化dp)

    最长不下降子序列 题目大意: 给定一个长度为 N 的整数序列:A\(_{1}\),A\(_{2}\),⋅⋅⋅,A\(_{N}\). 现在你有一次机会,将其中连续的 K 个数修改成任意一个相同值. 请你 ...

  9. D. Babaei and Birthday Cake---cf629D(LIS线段树优化)

    题目链接:http://codeforces.com/problemset/problem/629/D 题意就是现有n个蛋糕,蛋糕的形状是圆柱体,每个蛋糕的体积就是圆柱体的体积,每个蛋糕的编号是1-- ...

随机推荐

  1. sprintf使用时需要注意的问题

  2. 约瑟夫环(java)

    问题描述:n个人围成一圈,每隔k个杀死一个,问最后的幸存者的编号 假设标号是0 ~ n-1,幸存者是f[n] 1.特殊情况:f[1]=0 2.一般情况:f[n] = (f[n-1]+k)%n 游戏开始 ...

  3. c++ vector容器遍历方式

    #include <vector> #include <iostream> class Test { public: int a; int b; int c; Test() { ...

  4. 【2019-5-26】python:字典、常用字符串处理方法及文件操作

    一.数据类型:字典 1.字典: 1.1定义字典:dict={'key':'value'} 1.2字典与列表相比,字典取值快,可直接找到key 1.3字典是无序的,不能根据顺序取值 1.4多个元素用逗号 ...

  5. Android UI: LinearLayout中layout_weight 属性的使用规则

    首先来查看android sdk文档,有这么一段话 LinearLayout also supports assigning a weight to individual children with ...

  6. metasploitable2更改root密码

    metasploitable2这个系统众所周知,一个用户名和密码是msfadmin.但是这个账号权限不全,我们想要改root密码来登陆为所欲为.也没试过破解,咱们索性就改了吧. 就简单几行代码..   ...

  7. JSP菜鸟之困

    我一直想把java一套系统学好... 之前寒假学了android......feel good 大四又把jsp补习了一边.....85 但是苦于没有做过实例..... 暑假学PS之间想恶补一下jsp. ...

  8. Sticky footer经典布局--绝对底部布局

    原文转载于:https://cnodejs.org/topic/56ebdf2db705742136388f71 何为Sticky footer布局? 我们常见的网页布局方式一般分为header(页头 ...

  9. Python编译错误总结

    1.TypeError: object() takes no parameters 如果你出现了这个报错,请检查你的__init__函数名或者其定义有没有写错.一般是把__init__写成了__int ...

  10. loadrunner使用随机值

    用户登录设置:系统用1000000001.1000000002等可以登录系统,这个代表登录的用户名