1. 程式人生 > >NOIP模擬:最佳序列(單調佇列DP)

NOIP模擬:最佳序列(單調佇列DP)

給一個序列,求所有滿足長度在給定 L,R之中的序列的平均值的最大值。

題解:單調佇列+DP。

看到平均值應該想到二分平均值然後再每個數減去這個平均值,此時所有平均值滿足大等於當前二分的平均值的序列的區間和大等於0。

考慮統計減去平均值後序列的字首和,問題變為每個數ai選擇之前[iR,iL]的一個數aj,使得aiaj,這是一個經典的單調佇列優化DP。

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    char ch=getchar();int i=0,f=1;
    while(!isdigit
(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){i=(i<<1)+(i<<3)+ch-'0';ch=getchar(); } return i*f; } const int Maxn=2e4+50; int n,L,R,a[Maxn]; double mid; inline bool check(double v){ static double sum[Maxn],que[Maxn]; static int head,tail,pos[Maxn]; head=1;tail=0
; for(int i=1;i<=n;i++)sum[i]=1.0*a[i]-v+sum[i-1]; for(int i=L;i<=n;i++){ while(head<=tail&&que[tail]>=sum[i-L])--tail; while(head<=tail&&pos[head]+R<i)++head; que[++tail]=sum[i-L];pos[tail]=i-L; if(sum[i]-que[head]>=0)return
true; } return false; } int main(){ n=read(),L=read(),R=read(); for(int i=1;i<=n;i++)a[i]=read(); double l=0,r=1e6; for(int t=1;t<=100;t++){ mid=(l+r)/2; if(check(mid))l=mid; else r=mid; } printf("%.4f\n",mid); }

相關推薦

NOIP模擬最佳序列單調佇列DP

給一個序列,求所有滿足長度在給定 L,R之中的序列的平均值的最大值。 題解:單調佇列+DP。 看到平均值應該想到二分平均值然後再每個數減去這個平均值,此時所有平均值滿足大等於當前二分的平均值

2018.10.30 NOIP模擬 字胡串單調棧+容斥

傳送門 對於每個點,用單調棧求出它左右第一個比他大的位置。 然後對每個點 O ( l

2018.10.05 NOIP模擬 上升序列狀壓dp

描述 給出一個長度為 m 的上升序列 A(1 ≤ A[i]≤ n), 請你求出有多少種 1…n 的排列, 滿足 A 是它的一個 LIS. 輸入 第一行兩個整數 n,m. 接下來一行 m 個整數, 表示

[BZOJ1233][Usaco2009Open]乾草堆tower單調佇列優化

傳送門 題意搞skr人…,其實就是堆方塊: 有n(n<=100000)個乾草,每堆有個寬度,現在要且分成若干段,把每一段的乾草按順序堆起來形成一個多層的乾草堆(所以下標越小的乾草堆放在越下面)且寬度要逐層非嚴格遞減(上面一層的寬度<=下面一層的寬度),求最多可以放多少層。

HDU6406 Taotao Picks Apples單調佇列+二分

當時只差臨門一腳,多了許多罰時,貼個程式碼警示一下; #include<bits/stdc++.h> #define MAXN 100000 using namespace std; int s[100005],a[100005],b[100005],c[100

poj 2823 Sliding Window單調佇列模板

介紹單調佇列不錯的部落格:點選開啟連結 還有這題輸出用printf G++交會T,C++就能過.....而用cout兩個都能過..好坑.... 程式碼: #include<cstdio> using namespace std; const int maxn

SPOJHouse Fence分治&DP

day 一個 prev 現在 wan stroke AS make ica "Holiday is coming, holiday is coming, hurray hurray!" shouts Joke in the last day of his college.

HDU-6035Colorful Tree虛樹+DP

node different ase 得到 第一題 false all 直接 files 這裏有三道長得像的題: 一: HDU6036: There is a tree with nn nodes, eac

BZOJ3591 最長上升子序列狀壓dp

[] line 以及 char == 最長上升子序列 lis stdin lib   之前聽說過一種dp套dp的trick,大致是用另一個dp過程中用到的一些東西作為該dp的狀態。這個題有異曲同工之妙。   考慮求LIS時用到的單調隊列。設f[S]為所選取集合為S的方案數,

2018.10.01【校內模擬】偷書狀壓DP

描述 在L的書架上,有N本精彩絕倫的書籍,每本書價值不菲。 M是一個書籍愛好者,他對L的書籍早就垂涎三尺。最後他忍受不了誘惑,覺得去偷L的書,為了迅速完成這件事,同時他不希望L很快發現書籍少了,他決定偷書時,對於任意連續的k本書,他最多選B本,最少選A本。現在他

最長公共子序列動態規劃DP

#include<iostream> #include<cstdio> using namespace std; char x[101]; //字元陣列x儲存字串x c

2018.10.14 NOIP訓練 水流成河換根dp

傳送門 換根dp入門題。 貌似李煜東的書上講過? 不記得了。 先推出以1為根時的答案。 然後考慮向兒子轉移。 我們記f[p]f[p]f[p]表示原樹中以ppp為根的子樹的答案。 g[p]g[p]g[p

HihoCoder - 1794拼三角形 狀壓DP

描述 給定 n 根木棍,第 i 根長度為 ai 現在你想用他們拼成儘量多的面積大於 0 的三角形,要求每根木棍只能被用一次,且不能折斷 請你求出最多能拼出幾個 輸入 第一行一個正整數 n 第二行 n 個正整數 a1 … an 1 ≤ n ≤ 15 1 ≤ ai ≤ 109

noip 2016(憤怒的小鳥)狀壓dp

狀壓dp,每位代表一隻豬,1為豬打到了,0為豬還沒打到 兩個豬的座標確定一條拋弧線(即為打出鳥的軌跡) g[i][j]表示由i豬和j豬確定的拋弧線,能打到的豬。(是一個二進位制的狀態) 預處理:把能被i豬和j豬確定的這條拋弧線能打到的豬都用狀壓的1來表示,存到g[i][

C++物件Json序列最佳實踐基於Rapidjson庫C++記憶體物件和Json字串互相轉換

介紹:RapidjsonRapidjson庫是C++物件序列化到Json字串的非常好的工具,以效率著稱,騰訊的人寫的。這個庫的缺點(個人拙見):1 暴露的細節相對較多:容器,迭代器,型別,成員函式,序列化,反序列化,都有非常細緻的操作。這個給使用者帶來記憶負擔較重。至少需要同

哈理工OJ 1522 子序列的和單調佇列dp

子序列的和 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 289(61 users) Total Accepted: 71(43 users) Rating:  Special Judge: No

聯賽模擬測試18 A. 施工 單調佇列優化DP

## 題目描述 ![](https://img2020.cnblogs.com/blog/1996139/202010/1996139-20201017112702146-883654574.png) ![](https://img2020.cnblogs.com/blog/1996139/202010/19

BZOJ 4540 [Hnoi2016]序列 單調棧+ST表+莫隊算法

bsp online noi 位置 ble 個數 一個 pro problem 題目鏈接 BZOJ4540 考慮莫隊算法。 這題難在[l, r]到[l, r+1]的轉移。 根據莫隊算法的原理,這個時候答案應該加上 $cal(l, r + 1) + cal(l +

BZOJ - 5427最長上升子序列 二分&思維

現在給你一個長度為n的整數序列,其中有一些數已經模糊不清了,現在請你任意確定這些整數的值, 使得最長上升子序列最長。(為何最長呢?因為hxy向來對自己的rp很有信心)   Input 第一行一個正整數n 接下來n行第i行格式如下

P3084 [USACO13OPEN]照片Photo dp+單調佇列優化

題目連結:傳送門 題目: 題目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N <= 200,000), which, as always