1. 程式人生 > >BZOJ 4709: [Jsoi2011]檸檬 決策單調性 單調棧

BZOJ 4709: [Jsoi2011]檸檬 決策單調性 單調棧

4709: [Jsoi2011]檸檬

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 229  Solved: 100
[Submit][Status][Discuss]

Description

Flute 很喜歡檸檬。它準備了一串用樹枝串起來的貝殼,打算用一種魔法把貝殼變成檸檬。貝殼一共有 N (1 ≤ N ≤ 100,000) 只,按順序串在樹枝上。為了方便,我們從左到右給貝殼編號 1..N。每隻貝殼的大小不一定相同,貝殼 i 的大小為 si(1 ≤ si ≤10,000)。變檸檬的魔法要求,Flute 每次從樹枝一端取下一小段連續的貝殼並選擇一種貝殼的大小 s0。如果 這一小段貝殼中 大小為 s0 的貝殼有 t 只,那麼魔法可以把這一小段貝殼變成 s
0t^2 只檸檬。Flute 可以取任意多次貝殼,直到樹枝上的貝殼被全部取完。各個小段中,Flute 選擇的貝殼大小 s0 可以不同。而最終 Flute 得到的檸檬數,就是所有小段檸檬數的總和。Flute 想知道,它最多能用這一串貝殼變出多少檸檬。請你幫忙解決這個問題。

Input

第 1 行:一個整數,表示 N。 第 2 .. N + 1 行:每行一個整數,第 i + 1 行表示 si。

Output

僅一個整數,表示 Flute 最多能得到的檸檬數。

Sample Input

5
2
2
5
2
3

Sample Output

21
//Flute 先從左端取下 4 只貝殼,它們的大小為 2, 2, 5, 2。選擇 s0 = 2,那麼這一段
裡有 3 只大小為 s0 的貝殼,通過魔法可以得到 2×3^2 = 18 只檸檬。再從右端取下最後一
只貝殼,通過魔法可以得到 1×3^1 = 3 只檸檬。總共可以得到 18 + 3 = 21 只檸檬。沒有
比這更優的方案了。

去翻了點資料。。


題解在這裡

#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<complex>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<map>
#include<set>
using namespace std;

typedef long long ll;
typedef double db;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}

void print(ll x)
{if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}

const int N=100100;

int n;

int last[N],a[N],s[N];

ll f[N];

vector<int>vect[N];

int head[N],tail[N];

inline ll cal(int x,int z)
{return f[x]+1ll*z*(s[x+1]-1)*(s[x+1]-1);}

inline db slope(int x,int y,int z)
{return 1.0*(cal(x,z)-cal(y,z))/(s[x+1]-s[y+1]);}

int main()
{
	n=read();
	register int i,j,l,r,mid;
	for(i=1;i<=n;++i)a[i]=read();
	for(i=1;i<=n;++i){s[i]=s[last[a[i]]]+1;last[a[i]]=i;}
	for(i=1;i<=n;++i)
	{
		vector<int> &vec=vect[a[i]];
		while(head[a[i]]+1<tail[a[i]]&&slope(vec[tail[a[i]]-1],vec[tail[a[i]]-2],a[i])<slope(i-1,vec[tail[a[i]]-1],a[i]))tail[a[i]]--,vec.pop_back();
		vec.push_back(i-1);tail[a[i]]++;
		if(tail[a[i]]==1)j=0;
		else if(slope(vec[tail[a[i]]-1],vec[tail[a[i]]-2],a[i])>2*a[i]*s[i])j=tail[a[i]]-1;
		else if(slope(vec[head[a[i]]],vec[head[a[i]]+1],a[i])<2*a[i]*s[i])j=head[a[i]];
		else 
		{
			l=1,r=tail[a[i]]-2;
			while(l<=r)
			{
				mid=(l+r)>>1;
				slope(vec[mid-1],vec[mid],a[i])>2*a[i]*s[i]?l=mid+1:r=mid-1;
			}
			j=l-1;
		}
		j=vec[j];
		f[i]=f[j]+1ll*(s[i]-s[j+1]+1)*(s[i]-s[j+1]+1)*a[i];
	}
	print(f[n]);puts("");
	return 0;
}
/*
5
2
2
5
2
3

21
*/

相關推薦

BZOJ 4709: [Jsoi2011]檸檬 決策調性 單調

4709: [Jsoi2011]檸檬 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 229  Solved: 100 [Submit][Status][Discuss] Description Flute 很喜歡檸檬。

[BZOJ4709][JSOI2011]檸檬[決策調性優化]

有太多題解在瞎寫,發這個主要是提醒一下不要被傻逼們寫的東西誤導 我好幾次想要把這個題想明白,但那些所謂的“題解”讓我浪費了許多天時間 如果說上面那些題解裡說的“時間”本意是指s[i]而不是轉移過來的位置,那麼原諒我語文不好 二分的是s[i],單調棧裡的元素比較關鍵字也是s[i],而不是位置 #i

【BZOJ4709】檸檬(決策調性)

題目連結 題目描述 Flute 很喜歡檸檬。它準備了一串用樹枝串起來的貝殼,打算用一種魔法把貝殼變成檸檬。貝殼一共有 N (1 ≤ N ≤ 100,000) 只,按順序串在樹枝上。為了方便,我們從左到右給貝殼編號 1..N。每隻貝殼的大小不一定相同,

bzoj 2216 [Poi2011]Lightning Conductor 決策調性+dp

pre inline 假設 int efi 當前 www. 記錄 sin 題面 題目傳送門 解法 決策單調性比較經典的題吧 題目就是要對於每一個\(i\)求\(f_i=max(a_j-a_i+\sqrt{|i-j|}))\) 可以發現,\(\sqrt n\)的增長速度比較慢

bzoj 1563 [NOI2009]詩人小G 決策調性+dp

ref bit std online mes pac c++ () include 題面 題目傳送門 解法 可以得到一個顯然的dp方程 $\(f_i=min(f_j+(s_i-s_j+i-j-1-L)^p)\) 不妨把後面的東西看成\(w(j,i)\) 所以就變成\(f_i

洛谷P2900 [USACO08MAR]土地征用Land Acquisition(動態規劃,斜率優化,決策調性,線性規劃,單調隊列)

tps include 寫法 lan clas com mat 成了 dong 用兩種不一樣的思路立體地理解斜率優化,你值得擁有。 題意分析 既然所有的土地都要買,那麽我們可以考慮到,如果一塊土地的寬和高(其實是蒟蒻把長方形立在了平面上)都比另一塊要小,那麽肯定是直接並購,

BZOJ 1563】 (四邊形優化、決策調性

1563: [NOI2009]詩人小G Time Limit: 100 Sec  Memory Limit: 64 MBSubmit: 2611  Solved: 840 Description Input Output 對於每組資料,若最小的不協排程不超過1018,則第一行一個數表示不協排程若最小的不

BZOJ 1563: [NOI2009]詩人小G 決策調性DP

題目大意:給定若干個字串,可以將相鄰的若干個字串連線起來並在其中插入空格,最小化每個字串與給定長度的差的絕對值的p次方。 題解:一眼看上去像是之前做過的斜率優化,但是仔細一看不是平方變成了p次方,這就

bzoj2216 [Poi2011]Lightning Conductor(決策調性+分治/二分+單調

化簡一下就是求ans[i]=max{aj+|i−j|−−−−−√}−a[i]ans[i]=max{aj+|i−j|}−a[i] 我們把絕對值去掉,正著倒著各做一遍即可。 現在只考慮<i<i的jj 設k1<k2<ik1<k2&l

bzoj 4899 記憶的輪廓 題解(概率dp+決策調性優化)

題目背景 四次死亡輪迴後,昴終於到達了賢者之塔,當代賢者夏烏拉一見到昴就上前抱住了昴“師傅!你終於回來了!你有著和師傅一樣的魔女的餘香,肯定是師傅”。眾所周知,大賢者是嫉妒魔女沙提拉的老公,400年前與神龍、劍聖一起封印魔女因子暴走的莎緹拉。在魔女茶會的時候,莎緹拉也表示過對昴濃濃的

[Noi2016]區間[離散化+線段樹維護+決策調性]

fin include efi cmp http 說明 int min unique 4653: [Noi2016]區間 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 621 Solved: 329[Submit][

【BZOJ2216】[Poi2011]Lightning Conductor 決策調性

隊列 節點 zoj blog output tdi 最小 class clas 【BZOJ2216】[Poi2011]Lightning Conductor Description 已知一個長度為n的序列a1,a2,...,an。對於每個1<=i<=n,

bzoj4518: [Sdoi2016]征途(DP+決策調性分治優化)

clas code -1 long long lib fine bsp char click   題目要求...   化簡得...   顯然m和sum^2是已知的,那麽只要讓sigma(si^2)最小,那就變成了求最小平方和的最小值,經典的決策單調性,用分治優

BZOJ_1563_[NOI2009]詩人小G_決策調性

esp con algo pri 技術分享 r++ div 方案 句子 BZOJ_1563_[NOI2009]詩人小G_決策單調性 Description Input Output 對於每組數據,若最小的不協調度不超過1018,則第一行一個數表示不協調度若最

決策調性

復雜 stream 添加 雙端隊列 math str 相關 void 代碼 決策單調性 單調隊列和斜率優化是屬於決策單調性的一種。而決策單調性是滿足四邊形不等式的前提下,滿足i+1-n的轉移點大於等於i的決策點。而基本實現方式是整體二分或者維護雙端隊列並且在雙端隊列上二分

【BZOJ4444】國旗計劃 - 決策調性

還要 方向 img 二分 線上 () 形式 代碼 dep Description A國正在開展一項偉大的計劃——國旗計劃。這項計劃的內容是邊防戰士手舉國旗環繞邊境線奔襲一圈。這項計劃需要多名邊防戰士以接力的形式共同完成,為此,國土安全局已經挑選

洛谷P1973 [NOI2011]Noi嘉年華(決策調性

ons char 決策單調 problem isdigit stream tdi amp pri 傳送門 鑒於FlashHu大佬講的這麽好(而且我根本不會)我就不再講一遍了->傳送 1 //minamoto 2 #include<iostre

bzoj1563: [NOI2009]詩人小G 決策調性(1D1D)

單調性 .com const cst 方程 algorithm tdi com stp 目錄 題目鏈接 題解 代碼 題目鏈接 bzoj1563: [NOI2009]詩人小G 題解 \(n^2\)dp長這樣 \(f_i = min(f_j + (sum_i - sum

Codeforces 868F. Yet Another Minimization Problem【決策調性優化DP】【分治】【莫隊】

LINK 題目大意 給你一個序列分成k段 每一段的代價是滿足\((a_i=a_j)\)的無序數對\((i,j)\)的個數 求最小的代價 思路 首先有一個暴力dp的思路是\(dp_{i,k}=min(dp_{j,k}+calc(j+1,i))\) 然後看看怎麼優化 證明一下這個DP的決策

決策調性優化

決策單調性是對於一些dp式子,比如說ans[i] = max(a[j] + sqrt(i-j)) (j < i) 如果在一個i滿足a[j] + sqrt(i-j) < a[k] + sqrt(i - k)且j<k,那麼可以發現在i變大的時候j也一定會比k劣,沒有優於k的