日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

LuoguP5504 [JSOI2011]柠檬

發(fā)布時間:2023/12/3 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LuoguP5504 [JSOI2011]柠檬 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

LuoguP5504 [JSOI2011]檸檬

題目描述

Solution

容易發(fā)現(xiàn)一個性質(zhì):每一段劃分區(qū)間的首尾兩個元素相同。
因為倘若不相同的話其中至少一個元素也就不產(chǎn)生貢獻(xiàn),將其劃分在其他區(qū)間一定不會變劣。

因此就可以寫出一個簡單的O(n2)O(n^2)O(n2)dpdpdp
fi=fj?1+(si?sj+1)2(ai=aj)f_i=f_{j-1}+(s_i-s_j+1)^2\;\;\;\;\;\;\;(a_i=a_j) fi?=fj?1?+(si??sj?+1)2(ai?=aj?)
其中sis_isi?表示在iii之前的與iii相同的元素的個數(shù)。

考慮決策單調(diào)性:
設(shè)有j1<j2<ij_1<j_2<ij1?<j2?<iaj1=aj2a_{j_1}=a_{j_2}aj1??=aj2??,令getans(x,y)getans(x,y)getans(x,y)表示fx?1+(sy?sx+1)2f_{x-1}+(s_y-s_x+1)^2fx?1?+(sy??sx?+1)2

getans(j1,i)≥getans(j2,i)getans(j_1,i)\geq getans(j_2,i)getans(j1?,i)getans(j2?,i),則對于所有i′≥ii'\geq iii,都有getans(j1,i′)≥getans(j2,i′)getans(j_1,i')\geq getans(j_2,i')getans(j1?,i)getans(j2?,i),因為兩者的增長都是平方級別的。

因此我們可以用單調(diào)棧維護(hù)這一過程。
對于每一種aia_iai?開一個單調(diào)棧,我們希望的是保證棧中元素的getans(...,i)getans(...,i)getans(...,i)始終遞增。每次如果發(fā)現(xiàn)棧頂元素沒有它下面一個元素優(yōu),就彈棧。

但這并不是完全正確的,隨著iii的后移,因為前面的元素增長快,所以可能存在一個j1<j2<j3<ij_1<j_2<j_3<ij1?<j2?<j3?<i,使得getans(j1,i)>getans(j3,i)getans(j_1,i)>getans(j_3,i)getans(j1?,i)>getans(j3?,i),但getans(j2,i)<getans(j3,i)getans(j_2,i)<getans(j_3,i)getans(j2?,i)<getans(j3?,i)

因此我們還需要保證棧中每一個元素xxx超過上面一個元素yyy的時間小于yyy超過它上面的元素zzz的時間。

這個某個元素超過另一個元素的時間可以二分求得。

所以我們維護(hù)單調(diào)棧時額外添加一個判斷getans(stack[top?2])>getans(stack[top?1])getans(stack[top-2])>getans(stack[top-1])getans(stack[top?2])>getans(stack[top?1])的時間是否比getans(stack[top?1])>getans(stack[top])getans(stack[top-1])>getans(stack[top])getans(stack[top?1])>getans(stack[top])的時間短即可。

時間復(fù)雜度O(nlgn)O(nlgn)O(nlgn)

#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #include <cassert> #include <string.h> //#include <unordered_set> //#include <unordered_map> //#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B) #define PB(A) push_back(A) #define SIZE(A) ((int)A.size()) #define LEN(A) ((int)A.length()) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define fi first #define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; } template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll; typedef unsigned long long ull; typedef long double lod; typedef pair<int,int> PR; typedef vector<int> VI;const lod eps=1e-11; const lod pi=acos(-1); const int oo=1<<30; const ll loo=1ll<<62; const int mods=998244353; const int MAXN=600005; const int INF=0x3f3f3f3f;//1061109567 /*--------------------------------------------------------------------*/ inline int read() {int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f; } ll f[MAXN]; vector<int> V[MAXN]; int a[MAXN],s[MAXN],cnt[MAXN],n; ll Getans(int x,int y) { return f[x-1]+1ll*a[x]*y*y; } ll getans(int x,int y) { return f[x-1]+1ll*a[x]*(s[y]-s[x]+1)*(s[y]-s[x]+1); } int check(int x,int y) {int l=s[y],r=n+1;while (l<r){int mid=(l+r)>>1;if (Getans(x,mid-s[x]+1)>=Getans(y,mid-s[y]+1)) r=mid;else l=mid+1;}return r; } int main() {n=read();for (int i=1;i<=n;i++) s[i]=++cnt[a[i]=read()];f[0]=0;for (int i=1,sz;i<=n;i++){sz=V[a[i]].size()-1;while (sz>=1&&check(V[a[i]][sz-1],V[a[i]][sz])<=check(V[a[i]][sz],i)) V[a[i]].pop_back(),sz--;V[a[i]].PB(i),sz++;while (sz>=1&&getans(V[a[i]][sz-1],i)>=getans(V[a[i]][sz],i)) V[a[i]].pop_back(),sz--;f[i]=getans(V[a[i]][sz],i);}printf("%lld\n",f[n]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的LuoguP5504 [JSOI2011]柠檬的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。