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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【JZOJ 4623】搬运干草捆

發(fā)布時(shí)間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JZOJ 4623】搬运干草捆 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

Solution

題解說(shuō)用splay來(lái)解,我不會(huì),我用貪心,
顯然的,在使當(dāng)前答案最優(yōu)的同時(shí),也要保證當(dāng)前做到的最后一個(gè)干草的高度最高,
把每個(gè)修改后高度一樣的干草合成一個(gè)塊,設(shè)每個(gè)干草原高度為ai,修改后的整塊的高度為bk
我們先來(lái)考慮局部的解:
當(dāng)前做到i,
如果bk=ai,直接合并上去,
如果bk>ai,新開(kāi)一個(gè)塊,
如果bk<ai有x個(gè),a>bk有y個(gè),
一個(gè)結(jié)論:在只有兩個(gè)點(diǎn)的情況下,把一個(gè)點(diǎn)升高和把另一個(gè)點(diǎn)減低的代價(jià)是一樣的,
同樣的,如果塊中x=y,那么結(jié)論同樣成立,因?yàn)槲覀兛梢园阉鼈兛闯梢桓咭坏蛢蓛膳鋵?duì)的點(diǎn)對(duì)。
當(dāng)x>y時(shí),只能把i點(diǎn)降低,
當(dāng)x=y時(shí),代價(jià)與上情況相同,因?yàn)榇鷥r(jià)不變,可以升高整塊的高度,
找到一個(gè)高度q=minaj>bk{aj}(用主席樹(shù))為升高的上限高度,因?yàn)槿绻偕叽鷥r(jià)就會(huì)變,
如果q大于上一個(gè)塊的高度bk?1,顯然不合法,只把當(dāng)前區(qū)間升到bk?1,并把這兩個(gè)塊合并,
如果不是,就直接上升到q,

最后的答案就是每個(gè)塊的代價(jià)和,
復(fù)雜度:O(nlog(n))
圖片from YxuanwKeith

Code

#include<iostream> #include<cstdio> #include<cstdlib> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long LL; const int N=100500,INF=2070483640; int read(int &n) {char ch=' ';int q=0,w=1;for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());if(ch=='-')w=-1,ch=getchar();for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n; } int n,m; LL ans; int a[N],za0; struct wqwq {int b,x,y,i;LL ans;}za[N]; struct qqww {int l,r,s;}b[N*50]; int root[N],b0; struct wwq {int s,ans;}; void build(int l,int r,int e1,int &e2,int l2) {b[e2=++b0]=b[e1];if(l==r){b[e2].s++;return;}int t=(l+r)/2;if(l2<=t)build(l,t,b[e1].l,b[e2].l,l2);else build(t+1,r,b[e1].r,b[e2].r,l2);b[e2].s=b[b[e2].l].s+b[b[e2].r].s; } wwq find(int l,int r,int e1,int e2,int l1) {wwq ans;ans.s=b[e2].s-b[e1].s;if(b[e2].s-b[e1].s==0)return ans;if(l==r){ans.ans=l;return ans;}int t=(l+r)/2;if(t<l1)return find(t+1,r,b[e1].r,b[e2].r,l1);else {wwq s=find(l,t,b[e1].l,b[e2].l,l1);if(s.s)return s;return find(t+1,r,b[e1].r,b[e2].r,l1);} } int main() {int mx=0;wwq q;read(n);fo(i,1,n)mx=max(mx,read(a[i]));za[0].b=INF;fo(i,1,n){build(1,mx,root[i-1],root[i],a[i]);if(za[za0].b>a[i])za[++za0].x=1,za[za0].y=0,za[za0].b=a[i],za[za0].ans=0,za[za0].i=i;else if(za[za0].b==a[i])za[za0].x++;else{za[za0].y++;za[za0].ans+=a[i]-za[za0].b;while(za[za0].x==za[za0].y){q=find(1,mx,root[za[za0].i-1],root[i],za[za0].b+1);if(q.ans<=za[za0-1].b)za[za0].x+=q.s,za[za0].y-=q.s,za[za0].b=q.ans;if(q.ans>=za[za0-1].b){za[za0-1].x+=za[za0].x;za[za0-1].y+=za[za0].y;za[za0-1].ans+=za[za0].ans;za0--;}}}}ans=0;fo(i,1,za0)ans+=za[i].ans;printf("%lld\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【JZOJ 4623】搬运干草捆的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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