2019牛客暑期多校训练营(第九场)H Cutting Bamboos(主席树+二分)
题意:n个竹子,有高度,q次询问,询问之间是独立的,每次查询输入l,r,x,y代表砍区间[l,r]]内的竹子砍y次,最后一次要砍成0,每次砍掉的总长度相同,问第x次砍的高度是多少。
既然每次要求砍掉的东西都相同,那么就可以直接算出来砍第x次需要砍掉多少(sumh(l~r)/y*x),然后只需要二分这个高度,在主席树中查找大于等于这个高度的竹子总和减去个数乘以高度即可。
因为主席树的本质是由多颗权值线段树
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = ;
const int M = + ;
const int N = + ;
ll pre[N];
struct no{
int ls,rs;
ll sum,num;
}tree[N<<];
int rt[N],cnt;
void build(int &now , int l , int r){
now=++cnt;
tree[now].num=tree[now].sum=;
if(l==r) return ;
int mid=(l+r)>>;
build(tree[now].ls,l,mid);
build(tree[now].rs,mid+,r);
}
void update(int &now, int pre, int val, int l, int r){
now=++cnt;
tree[now]=tree[pre];
if(l==r){
tree[now].num++;
tree[now].sum+=val;
return ;
}
int mid=(l+r)>>;
if(val<=mid) update(tree[now].ls,tree[pre].ls,val,l,mid);
else update(tree[now].rs,tree[now].rs,val,mid+,r);
tree[now].num = tree[tree[now].ls].num + tree[tree[now].rs].num;
tree[now].sum = tree[tree[now].ls].sum + tree[tree[now].rs].sum;
}
ll query_num(int p, int q, int L, int R, int l, int r){
if(L <= l && r <= R) return tree[q].num - tree[p].num;
int mid = (l + r) >> ;
ll ans = ;
if(L <= mid) ans += query_num(tree[p].ls, tree[q].ls, L, R, l, mid);
if(mid < R) ans += query_num(tree[p].rs, tree[q].rs, L, R, mid + , r);
return ans;
}
ll query_sum(int p, int q, int L, int R , int l , int r)
{
if(L <= l && r <= R) return tree[q].sum - tree[p].sum;
int mid = (l + r) >> ;
ll ans = ;
if(L <= mid) ans += query_sum(tree[p].ls, tree[q].ls, L, R, l, mid);
if(mid < R) ans += query_sum(tree[p].rs, tree[q].rs, L, R, mid + , r);
return ans;
}
int main(){
int n,q;
scanf("%d%d",&n,&q);
build(rt[],,N);
for(int i= ; i<=n ; i++){
ll h;
scanf("%lld",&h);
pre[i]=pre[i-]+h;
update(rt[i],rt[i-],h,,N);
}
while(q--){
ll l,r,x,y;
scanf("%lld%lld%lld%lld",&l,&r,&x,&y);
double ql=,qr=N;
while(qr-ql>1e-){
double mid=(ql+qr)/;
ll qmid=ceil(mid);
ll qsum=query_sum(rt[l-],rt[r],qmid,N,,N);
ll qnum=query_num(rt[l-],rt[r],qmid,N,,N);
if(qsum-qnum*mid>=1.0*(pre[r]-pre[l-])*x/y) ql=mid;
else qr=mid;
}
printf("%.10lf\n", qr);
}
return ;
}
2019牛客暑期多校训练营(第九场)H Cutting Bamboos(主席树+二分)的更多相关文章
- 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem
题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3 4 2 3 4 输出:0 0 1 题解: 认真想一 ...
- 牛客网多校训练第九场H Cutting Bamboos
题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...
- 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)
题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...
- [题解] 2019牛客暑期多校第三场H题 Magic Line
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...
- 2019牛客多校第⑨场H Cutting Bamboos(主席树+二分)
原题:https://ac.nowcoder.com/acm/contest/889/H 题意: 给你一些竹子,q个询问,问你从第l到第r个竹子,如果你要用y次砍完它,并且每次砍下来的长度是相同的,问 ...
- 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)
layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
随机推荐
- jmeter模拟spike尖峰测
jmeter模拟spike尖峰测试 概述 尖峰测试(Spike testing)在性能测试中属于压力测试的一个子集.指的是在某一瞬间或者多个频次下用户数和压力陡然增加的场景. 为了验证我们的网站在访问 ...
- boost的libboost_system问题
最近把cpp代码从开发机放到eclipse时,遇到了不少路径问题. 安装boost的时候,其实很简单 wget http://sourceforge.net/projects/boost/files/ ...
- BP神经网络反向传播之计算过程分解(详细版)
摘要:本文先从梯度下降法的理论推导开始,说明梯度下降法为什么能够求得函数的局部极小值.通过两个小例子,说明梯度下降法求解极限值实现过程.在通过分解BP神经网络,详细说明梯度下降法在神经网络的运算过程, ...
- overflow的量两种模式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Ubuntu 安装 ansible
sudo apt update sudo apt-get install software-properties-common sudo apt-add-repository --yes ppa:an ...
- Ext.js性能优化漫谈
Ext.js是一个用于建立企业级应用的纯JS框架.毫无疑问,它为我们提供了大量的组件,比如container,panel,field,grid,这些组件使用起来很方便,不需要去写js和html,但是e ...
- sqoop简单使用
一,通过sqoop将MySQL里面的数据加载到HDFS 先查看有哪些数据库 查看表person sqoop list-databases --connect jdbc:mysql://ly-p2p4: ...
- time模块的time方法、perf_counter方法和process_time方法的区别
1. time.time()方法 返回自纪元以来的秒数作为浮点数,但是时期的具体日期和闰秒的处理取决于使用的平台.比如:在Windows和大多数Unix系统上,纪元是1970年1月1日00:00:00 ...
- VS #include 【bits/bstdc++.h】出错
目录 1. 本文地址 2. 按 3. 操作步骤 1. 本文地址 博客园:https://www.cnblogs.com/coco56/p/11163142.html 简书:https://www.ji ...
- 【爬虫】Selenium+chrome
一.下载对应chrome版本的webdriver https://npm.taobao.org/mirrors/chromedriver 二.pom <dependency> <gr ...