• 求上升子序列的最大和。O(n^2)会暴力,在查询的时候要用线段树维护
  • 因为权值是浮点数,故先离散化一下,设第 i 个位置的权值,从小到大排名为 id。那么dp转移中 $$d[i] = max(d[i],d[i] + d[j])$$ 其中$$j<i & id[j]<id[i]$$ 故线段树结点区间[l,r]维护的是id = l 到 id = j 中的最大 dp值
#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
double vol[N],r,h;
int n,has[N],g[N],dp[N],tot;
int c[N];
vector<double> v;
int getId(double a){
return lower_bound(v.begin(),v.end(),a)-v.begin()+1;
}
struct Tree{
int l,r;
double data;
}t[4*N];
void build(int p,int l,int r){
t[p].l = l;
t[p].r = r;
if(l==r){
t[p].data = 0;return;
}
int mid = l+r>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].data = 0;
}
void change(int p,int x,double val){
if(t[p].l == t[p].r && t[p].l == x){
t[p].data = max(t[p].data,val);
return ;
}
int mid = (t[p].l+t[p].r)>>1;
if(x<=mid)change(p*2,x,val);
else change(p*2+1,x,val);
t[p].data = max(t[p*2].data,t[p*2+1].data);
}
double ask(int p,int l,int r){
if(t[p].l>=l&&t[p].r<=r)return t[p].data;
int mid = (t[p].l+t[p].r)>>1;
double val = 0;
if(l<=mid)val = max(val,ask(p*2,l,r));
if(r>mid)val = max(val,ask(p*2+1,l,r));
return val;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lf%lf",&r,&h);
vol[i] = acos(-1) * r * r * h;
v.push_back(vol[i]);
}
sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());
build(1,1,n);
double res = 0;
for(int i=1;i<=n;i++){
int id = getId(vol[i]);
double now = ask(1,1,id-1);
now = max(vol[i],vol[i]+now);
res = max(res,now);
change(1,id,now);
}
printf("%.10lf\n",res);
return 0;
}
  • 辗转了很多次,惭愧,线段树做的题太少了

法二:离散化+树状数组

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
const int inf = 0x3f3f3f3f;
double vol[N],c[N];
vector<double> v;
int n,g[N];
int getId(double res){
return lower_bound(v.begin(),v.end(),res) - v.begin() + 1;
}
void add(int x,double y){
c[x] = y;
for(;x<=n;x+=x&-x)c[x] = max(c[x],y);
}
double ask(int x){
double res = 0;
for(;x;x-=x&-x)res = max(res,c[x]);
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
double r,h;
scanf("%lf%lf",&r,&h);
double vo = acos(-1) * r * r * h;
vol[i] = vo;
v.push_back(vo);
}
sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());
double res = 0;
for(int i=1;i<=n;i++){
int x = getId(vol[i]);
double now = ask(x-1) + vol[i];
add(x,now);
res = max(res,now);
}
printf("%.10lf\n",res);
return 0;
}

CF-629 D - Babaei and Birthday Cake (离散化 + 线段树|树状数组)的更多相关文章

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

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

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

  3. codeforces 629D D. Babaei and Birthday Cake (线段树+dp)

    D. Babaei and Birthday Cake time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. cf 61 E. Enemy is weak 离散化+树状数组

    题意: 给出一个数组,数组的每一个元素都是不一样的,求出对于3个数组下标 i, j, k such that i < j < k and ai > aj > ak where ...

  5. CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序

    http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...

  6. CF Educational Codeforces Round 10 D. Nested Segments 离散化+树状数组

    题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段. 方法是对所有线段的端点 ...

  7. hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化

    题意: 在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块. 题解: 块数=交点数+1 因为对于每个交点,唯一且不重复地对应着一块蛋糕. 就是 ...

  8. HDU 6318.Swaps and Inversions-求逆序对-线段树 or 归并排序 or 离散化+树状数组 (2018 Multi-University Training Contest 2 1010)

    6318.Swaps and Inversions 这个题就是找逆序对,然后逆序对数*min(x,y)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...

  9. 线段树&树状数组与离散化的妙用

    牛客2019多校联盟Day7 Fine the median 题意:  每次给数组插入区间[Li,Ri] 内的所有数,每操作一次查询中位数. 遇到这题真的算是巧合,然而就是这种冥冥之中的缘分,给了我线 ...

随机推荐

  1. 浅谈css常用伪类用法

    着重写一下after和before的用法: css样式搞定:标签元素+伪类after a.'class名':after{//我的样式名称是这个,可以写成你自己的样式名称 content: '已打包'; ...

  2. [WebShow系列] 比赛结果报表导出

    操作说明 现场管理员在 浏览器地址栏 输入[现场打分实时展示系统-Web版]的详情排行网址[注:相对网址 /home/rankdshow ] 调用 详情排行. 点击 详情排行榜主题 文字,可以把此排行 ...

  3. Jquery树形控件 $.fn.zTree.init

    https://www.cnblogs.com/jin-/p/4646202.html asp.net 树形控件 $.fn.zTree.init 在网页中通过jquery脚本来构筑树形控件将是一个不错 ...

  4. Java面向对象(static、final、匿名对象、内部类、包、修饰符、代码块)

    面向对象 今日内容介绍 u final u static u 匿名对象 u 内部类 u 包的声明与访问 u 四种访问修饰符 u 代码块 第1章 final关键字 1.1 final的概念 继承的出现提 ...

  5. 192.168.28.168:3000打开网页无法调试localhost为前缀的接口

    最近我在IIS上发布.net Core API的时候发现 当我用localhost去打开我的web项目时 并且,ajax调用的接口前缀为localhost时候,运行正确 但是当我用192.168.28 ...

  6. Kendo UI 单页面应用(四) Layout

    Kendo UI 单页面应用(四) Layout Layout 继承自 View,可以用来包含其它的 View 或是 Layout.下面例子使用 Layout 来显示一个 View <div i ...

  7. Flash图表FusionCharts如何自定义图表导出菜单或界面

    FusionCharts的导出组件界面有两种模式: Compact Mode: 用于保存单张图片,每一个单独的导出组件实例都代表单独的图表.在这种模式下,只有一个按钮和标题是可见的. Full Mod ...

  8. js读取excel数据后的时间格式转换

    使用xlsx.full.min.js 获取excel的日期数据为:37858: 拿到的整数值是日期距离1900年1月1日的天数,这时需要写一个函数转换: function formatDate(num ...

  9. 实现memcopy函数

    实现memcopy函数: void * memcpy(void *dest, const void *src, unsigned int count); { if ((src == NULL) || ...

  10. 如何修改Ruby的gem源(gem sources)

    Ruby环境下的gem sources地址默认是国外网络地址,所以在使用gem的过程中经常会出现找不到资源的Error.那么如何解决这种Error?方法很简单:要么就多次尝试执行gem命令,要么就修改 ...