题意: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(主席树+二分)的更多相关文章

  1. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  2. 牛客网多校训练第九场H Cutting Bamboos

    题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...

  3. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  4. [题解] 2019牛客暑期多校第三场H题 Magic Line

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...

  5. 2019牛客多校第⑨场H Cutting Bamboos(主席树+二分)

    原题:https://ac.nowcoder.com/acm/contest/889/H 题意: 给你一些竹子,q个询问,问你从第l到第r个竹子,如果你要用y次砍完它,并且每次砍下来的长度是相同的,问 ...

  6. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  7. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  8. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  9. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  10. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

随机推荐

  1. Session设置

    from django.shortcuts import render, redirect from django import views # Create your views here. fro ...

  2. 压缩图片工具类,压缩100KB以内拿走直接用

    最近遇到自拍上传图片过大问题,很烦恼,所以自己写了一个压缩图片的工具类使用,自测效果很不错,可以压缩到KB以内,像素还可以分辨清晰 下面Java代码奉上: import lombok.extern.s ...

  3. ceph部署-常用命令

    常用命令:1.ceph healthceph -s 2.ceph osd treeceph osd lspoolsceph osd pool [poolname] rbd pg_numceph osd ...

  4. Kubernetes kubeadm 安装记录

    Kubernetes kubeadm 安装记录 注:比较乱,都是一些预见到的错误 kubernetes yum 源 cat /etc/yum.repos.d/kubernetes.repo [kube ...

  5. SpringMvc参数绑定出现乱码解决方法

    在SpringMvc参数绑定过程中出现乱码的解决方法 1.post参数乱码的解决方法 在web.xml中添加过滤器 <!-- 过滤器 处理post乱码 --> <filter> ...

  6. .net core 自定义中间件

    public class MyMiddleware { //private IConfiguration _configuration; //第一步: private RequestDelegate ...

  7. Java学习day10-面向对象特征之一:封装和隐藏

    一.包package和引用import 1.关键字package package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包(若缺省该语句,则指定为无名包).包的存在是为了区别同名 ...

  8. Codeforces 984D 题解(DP)

    题面 传送门 题目大意: 给你一个计算区间f函数的公式,举例f(1,2,4,8)=f(1⊕2,2⊕4,4⊕8)=f(3,6,12)=f(3⊕6,6⊕12)=f(5,10)=f(5⊕10)=f(15)= ...

  9. 判断当前终端是手机还是pc端并进行不同的页面跳转

    判断当前设备(终端)是手机还是pc端并进行不同的页面跳转 DEMO 1 <script type="text/javascript"> function browser ...

  10. Leetcode Lect4 二叉树中的分治法与遍历法

    在这一章节的学习中,我们将要学习一个数据结构——二叉树(Binary Tree),和基于二叉树上的搜索算法. 在二叉树的搜索中,我们主要使用了分治法(Divide Conquer)来解决大部分的问题. ...