题解 | Cutting Bamboos-2019牛客暑期多校训练营第九场H题

2023-10-09 08:50

本文主要是介绍题解 | Cutting Bamboos-2019牛客暑期多校训练营第九场H题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目来源于牛客竞赛:https://ac.nowcoder.com/acm/contest/discuss
题目描述:
在这里插入图片描述
输入描述:
在这里插入图片描述
输出描述:
在这里插入图片描述
示例1:
在这里插入图片描述
在这里插入图片描述
题解:
在这里插入图片描述
代码:

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>using namespace std;
using namespace __gnu_pbds;#define fi first
#define se second
#define mp make_pair
#define pb push_backtypedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef unsigned long long ull;
typedef double ld;
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;const int N = 201111;
ll a[N+11];
const ld eps = 1e-7;struct Fenwick
{vector<ll> t;Fenwick(int n){t.assign(n+1,0);}void reset(int n){t.assign(n+1, 0);}void update(int p, ll v){p++;for (; p < (int)t.size(); p += (p&(-p))) t[p] += v;}ll query(int r) //finds [1, r] sum{                   r++;ll sum = 0;for (; r; r -= (r&(-r))) sum += t[r];return sum;}ll query(int l, int r) //finds [l, r] sum{if(l == 0) return query(r);return query(r) - query(l-1);}
};const int Q = 202222;
ld ans[Q+3];
ll pref[N+3];ll getsum(int l, int r)
{if(l==0) return pref[r];else return pref[r]-pref[l-1];
}pair<ii,ld> queries[Q+3];int main()
{ios_base::sync_with_stdio(0); cin.tie(0);int n,q; cin>>n>>q;ll mx=0;vector<ii> vec;for(int i=0;i<n;i++){cin>>a[i];pref[i]=a[i];vec.pb(mp(a[i],i));mx=max(mx,a[i]);if(i>0) pref[i]+=pref[i-1];}sort(vec.begin(),vec.end());queue<pair<pair<ld,ld>,vi> > Q;for(int z=0;z<q;z++){int l,r,x,y; cin>>l>>r>>x>>y;l--; r--;x=y-x;ld threshold = (ld(x)/ld(y))*ld(getsum(l,r));queries[z]=mp(mp(l,r),threshold);}vi all;for(int i=0;i<n;i++) all.pb(i);Q.push(mp(mp(0,mx),all));ld pre = -1;int ptr=0;Fenwick fen(n+2);Fenwick fen2(n+2);while(!Q.empty()){ld lo=Q.front().fi.fi; ld hi=Q.front().fi.se;ld mid=(lo+hi)*0.5;if(mid<pre){ptr=0; pre=-1; fen.reset(n+2); fen2.reset(n+2);}while(ptr<n&&vec[ptr].fi<=mid){fen.update(vec[ptr].se,vec[ptr].fi);fen2.update(vec[ptr].se,1);ptr++;}vi L,R;for(int v:Q.front().se){ans[v]=mid;int l=queries[v].fi.fi; int r=queries[v].fi.se; ld threshold = queries[v].se;ld sum = 0;sum+=(r-l+1-fen2.query(l,r))*ld(mid);sum+=ld(fen.query(l,r));if(sum<=threshold){R.pb(v);}else{L.pb(v);}}Q.pop();if(hi-lo>=eps){if(!L.empty()) Q.push(mp(mp(lo,mid),L));if(!R.empty()) Q.push(mp(mp(mid,hi),R));}pre=mid;}for(int i=0;i<q;i++){cout<<fixed<<setprecision(15)<<ans[i]<<'\n';}
}

更多问题,更详细题解可关注牛客竞赛区,一个刷题、比赛、分享的社区。
传送门:https://ac.nowcoder.com/acm/contest/discuss

这篇关于题解 | Cutting Bamboos-2019牛客暑期多校训练营第九场H题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/171695

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

暑期学习总结

iOS学习 前言无限轮播图换头像网络请求按钮的configuration属性总结 前言 经过暑期培训,完成了五个项目的仿写,在项目中将零散的内容经过实践学习,有了不少收获,因此来总结一下比较重要的内容。 无限轮播图 这是写项目的第一个难点,在很多项目中都有使用,越写越熟练。 原理为制造两个假页,在首和尾分别制作最后一页和第一页的假页,当移动到假页时,使用取消动画的方式跳到

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i