2019牛客多校第⑨场H Cutting Bamboos(主席树+二分)
原题:https://ac.nowcoder.com/acm/contest/889/H
题意:
给你一些竹子,q个询问,问你从第l到第r个竹子,如果你要用y次砍完它,并且每次砍下来的长度是相同的,问你第x次砍在哪。
思路:
先求前缀和,(l,r)区间要砍y刀,每刀总长度step=(sum[r]-sum[l-1])/y,第x次砍完必定还剩下总长度为step*(y-x)的竹子。想到可以二分砍的高度,判断砍得偏高还是偏低,可以通过计算剩下得总长度比要求大还是小。设高度为h,则剩下的总长度=\(高度小于h的竹子的高度和+高度大于h的竹子数量 * x\) ,主席树可以维护区间上小于x的元素个数以及元素和,正好满足要求。
//memeory:6.7e7
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int N=2e5+2;
const int Log=40;
ll val[maxn*Log],sum[maxn];
int root[maxn],a[maxn],num[maxn*Log],lson[maxn*Log],rson[maxn*Log];
int tot;
double Sum,Num;
int build(int l,int r){
int root=++tot;
val[root]=0;
num[root]=0;
if(l<r){
int mid=(l+r)>>1;
lson[root]=build(l,mid);
rson[root]=build(mid+1,r);
}
return root;
}
int update(int pre,int l,int r,int x){
int root=++tot;
num[root]=num[pre]+1;
val[root]=val[pre]+x;
lson[root]=lson[pre];
rson[root]=rson[pre];
if(l<r){
int mid=(l+r)>>1;
if(x<=mid) lson[root]=update(lson[pre],l,mid,x);
else rson[root]=update(rson[pre],mid+1,r,x);
}
return root;
}
void query(int Old,int New,int l,int r,int k){//查区间内<=k的数的个数
if(l>k)return;
if(r<=k){
Sum+=val[New]-val[Old];
Num+=num[New]-num[Old];
return;
}
int mid=(l+r)>>1;
query(lson[Old],lson[New],l,mid,k);//函数开始会判断跳出,这里不需要判断
query(rson[Old],rson[New],mid+1,r,k);
}
int main(){
int n,q;
cin>>n>>q;
root[0]=build(1,n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
root[i]=update(root[i-1],1,n,a[i]);
}
while(q--){
int l,r,x,y;
scanf("%d%d%d%d",&l,&r,&x,&y);
double li=0,ri=100000,eps=1e-10;
double step=1.0*(sum[r]-sum[l-1])/y;
while(ri-li>eps){
double mid=(li+ri)/2;
Sum=0;Num=0;
query(root[l-1],root[r],1,n,(int)mid);
Num=(r-l+1)-Num;//比mid矮的数量转化为比mid高的数量
double temp=mid*Num+Sum;
if(step*(y-x)<temp)//砍高了
ri=mid;
else li=mid;
}
printf("%.15lf\n",li);
}
}
2019牛客多校第⑨场H Cutting Bamboos(主席树+二分)的更多相关文章
- 牛客多校第九场H Cutting Bamboos(主席树 区间比k小的个数)题解
题意: 标记为\(1-n\)的竹子,\(q\)个询问,每次给出\(l,r,x,y\).要求为砍区间\(l,r\)的柱子,要求砍\(y\)次把所有竹子砍完,每次砍的时候选一个高度,把比他高的都砍下来,并 ...
- 2019 牛客多校第二场 H Second Large Rectangle
题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目大意 给定一个 n * m 的 01 矩阵,求其中第二大的子矩阵,子矩阵元素必须全部为 1.输出其大小 ...
- 2019牛客多校第二场H题(悬线法)
把以前的题补补,用悬线求面积第二大的子矩形.我们先求出最大子矩阵的面积,并记录其行三个方向上的悬线长度.然后排除这个矩形,记得还得特判少一行或者少一列的情况 #include <bits/std ...
- 2019牛客多校第一场H XOR 线性基模板
H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...
- 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解
题意: n * m的矩阵,为0表示可以走,1不可以走.规定每走一步只能向下.向左.向右走.现给定两种操作: 一.1 x y表示翻转坐标(x,y)的0.1. 二.2 x y表示从(1,x)走到(n,y) ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)
题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
随机推荐
- Frida Android hook native层__system_property_get的最终方案
记录这个问题的起因是,在hook时遇到了修改内容长度,超过原长度时,会出现显示不全的问题. 比如把nexus 5改成nexus 100,只会显示nexus 1. 所以去读了下源码 int __syst ...
- MySQL数据库参数优化
概述 最近在对各个系统的mysql做一些参数上的优化,也开了慢查询,准备后面针对特定sql再进一步优化.下面主要介绍一下一些优化的参数. 1.优化前mysql配置 可以看到基本上是没怎么做优化的. 2 ...
- pdf兼容问题不能正常预览
刚开始以为是这个PDF文件过大导致的 发现其他更大的文件也能正常显示 考虑到PDF的兼容问题 由于导出的PDF格式不兼容导致,如果有这种情况,可以尝试用word2016打开pdf文件,再导出成pdf.
- python 使用[[v]*n]*m遇到的问题
需求:想通过python生成m行n列的矩阵 方式1:(有问题) data = [[0]*3]*4 #4行3列 data 输出 [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, ...
- python zip 压缩
zipfile zip文件操作 引入模块: import zipfile zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下: zipfi ...
- Get column value of Flex Datagrid by QTP
' get the number of rows in the tablerowCount=Browser("Browser").FlexApplication("App ...
- Cocos2d-x之Vector<T>
| 版权声明:本文为博主原创文章,未经博主允许不得转载. Vector<T>是Cocos2d-x 3.x中推出的列表容器,在cocos2d-x3.0之前的版本是Array,因此它所能容 ...
- Cocos2d-x之Label
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 在游戏开发中经常会使用标签文字,例如,游戏介绍,玩家积分,菜单选项,文字提示等等. LabelTTF 直接支持使用 TTF 字库 ...
- python字符串有多少字节
是否有一些函数可以告诉我字符串在内存中占用多少字节? 我需要设置套接字缓冲区的大小,以便一次传输整个字符串. 解决方案 import sys sys.getsizeof(s) # getsizeof( ...
- 转载:tomcat性能的优化
考虑一下这种场景,你开发了一个应用,它有十分 优秀的布局设计,最新的特性以及其它的优秀特点.但是在性能这方面欠缺,不管这个应用如何都会遭到客户拒绝.客户总是期望它们的应用应该有更好的性能.如 果你在产 ...