• 求上升子序列的最大和。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. [WebShow系列] 倒计时展示相关问题

    WebShow内置了倒计时功能. 后台参数维护: 倒计时参数说明: 倒计时基准时间设置(秒数):假设设置为90,也就是从1分30秒开始倒计时,同时有开始提示音. 倒计时提示1剩余秒数:假设设置为30, ...

  2. Centos下安装pip失败或新装

    Centos安装pip失败: [root@localhost /]# yum -y install pip已加载插件:fastestmirrorRepodata is over 2 weeks old ...

  3. 用Open Live Writer写博体验

    感觉还蛮方便的--openlivewriter第一博!

  4. 事务&数据库连接池&DBUtils

    事务的特性 原子性 指的是 事务中包含的逻辑,不可分割. 一致性 指的是 事务执行前后.数据完整性 隔离性 指的是 事务在执行期间不应该受到其他事务的影响 持久性 指的是 事务执行成功,那么数据应该持 ...

  5. SpringCloud多模块整理

    1.项目架构 —— project        父项目 —— client        子项目(客户端)    对外暴露的接口 —————— pom.xml          子项目的pom文件 ...

  6. Servlet中文件上传的几种方式

    上传文件,因为上传的都是二进制数据,所以在Servlet中就不能直接用request.getParameter();方法进行数据的获取,需要借助第三方jar包对上传的二进制文件进行解析.常用的方式如下 ...

  7. SpringMVC+Thymeleaf 简单使用

    一.简介 1.Thymeleaf 在有网络和无网络的环境下皆可运行,而且完全不需启动WEB应用,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果.浏览器解释 h ...

  8. ArcGIS Server 10.1发布GP服务

    ArcGIS Server 10.1发布GP服务 ArcGIS Server 10.1发布GP服务确实更简单了,只是刚使用不怎么习惯.ArcGIS Server 10.1发布GP服务需要先在ArcCa ...

  9. BUG数量和项目成本

    这篇文章,不是讨论怎么提升程序员的能力避免BUG,因为程序员的能力不足造成的BUG,短期是无法避免的.这里主要探讨的是因为程序员疏忽大意和不良的开发习惯,产生的低级BUG,对项目成本影响. 首先了解下 ...

  10. SQL 字符串函数

    http://www.w3cschool.cn/sql/sql-string-functions.html SQL 字符串函数 序号 Name Description 备注 1 ASCII() 返回最 ...