當(dāng)前位置:
首頁 >
JZOJ 5402. 【NOIP2017提高A组模拟10.8】God Knows
發(fā)布時(shí)間:2025/3/15
26
豆豆
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 5402. 【NOIP2017提高A组模拟10.8】God Knows
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
Input
Output
Sample Input
5
3 1 4 5 2
3 4 3 4 1
Sample Output
5
Data Constraint
Solution
很容易想到 O(N2) DP。
設(shè) f[i] 表示當(dāng)最后一個(gè)選 i 為最優(yōu)答案時(shí)的最小代價(jià)。
枚舉符合條件的 j 轉(zhuǎn)移即可。
考慮優(yōu)化 DP 。
把 (p[i],i) 放到坐標(biāo)系里,如下圖:
按 i 從小到大的順序加入,那么對(duì)于一個(gè) i 能夠轉(zhuǎn)移的 j ,
顯然就是這個(gè)點(diǎn)左邊部分單調(diào)下降的一行點(diǎn)。
即以這個(gè)點(diǎn) j 為左下角、點(diǎn) i 為右上角的矩形中間沒有其他點(diǎn)。
如上圖,對(duì)于黃色的點(diǎn),能轉(zhuǎn)移的點(diǎn)就是綠色和藍(lán)色的點(diǎn)。
那么這就是經(jīng)典的線段樹維護(hù)單調(diào)棧的問題。
記錄一個(gè) mn=find(l,mid,rmx) ,那么區(qū)間的答案就是
min(mn,find(mid+1,r,rmx))這樣就能保證時(shí)間復(fù)雜度為 O(N?log2N) 。
Code
#include<cstdio> #include<cctype> using namespace std; const int N=2e5+5,inf=1e9; struct data {int mx,mn; }g[N<<2]; int rmx,qx,qy,ans=inf; int p[N],c[N],f[N]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline int max(int x,int y) {return x>y?x:y; } inline int min(int x,int y) {return x<y?x:y; } int calc(int v,int l,int r,int val) {if(g[v].mx<val) return inf;if(l==r) return g[v].mx>val?f[g[v].mx]:inf;int mid=l+r>>1;if(g[v<<1|1].mx<val) return calc(v<<1,l,mid,val);return min(g[v].mn,calc(v<<1|1,mid+1,r,val)); } int find(int v,int l,int r,int x,int y) {if(x<=l && r<=y){int num=calc(v,l,r,rmx);rmx=max(rmx,g[v].mx);return num;}int mid=l+r>>1;if(y<=mid) return find(v<<1,l,mid,x,y);if(x>mid) return find(v<<1|1,mid+1,r,x,y);int num=find(v<<1|1,mid+1,r,mid+1,y);return min(num,find(v<<1,l,mid,x,mid)); } void change(int v,int l,int r) {if(l==r){g[v].mx=qy;return;}int mid=l+r>>1;if(qx<=mid) change(v<<1,l,mid); else change(v<<1|1,mid+1,r);g[v].mn=calc(v<<1,l,mid,g[v<<1|1].mx);g[v].mx=max(g[v<<1].mx,g[v<<1|1].mx); } int main() {int n=read();for(int i=1;i<=n;i++) p[i]=read();for(int i=1;i<=n;i++) c[i]=read();for(int i=1;i<=n<<2;i++) g[i].mn=inf;for(int i=1;i<=n;i++){rmx=0;int num=find(1,1,n,1,p[i]);f[i]=(num<inf?num:0)+c[i];qx=p[i],qy=i;change(1,1,n);}for(int i=n,num=0;i;i--)if(p[i]>num) num=p[i],ans=min(ans,f[i]);printf("%d",ans);return 0; }總結(jié)
以上是生活随笔為你收集整理的JZOJ 5402. 【NOIP2017提高A组模拟10.8】God Knows的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 2957: 楼房重建
- 下一篇: JZOJ 5574. 【NOI2018模