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

歡迎訪問 生活随笔!

生活随笔

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

javascript

bzoj1560:[JSOI2009]火星藏宝图(斜率优化)

發(fā)布時(shí)間:2025/3/20 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj1560:[JSOI2009]火星藏宝图(斜率优化) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

在火星游玩多日,jyy偶然地發(fā)現(xiàn)了一張藏寶圖。根據(jù)藏寶圖上說法,寶藏被埋藏在一個(gè)巨大的湖里的N個(gè)島上(2<=N<=200,000)。為了方便描述,地圖把整個(gè)湖劃分成M行M列(1<=M<=1000),共M*M個(gè)小塊,并把所有島按照1...N編了號。第i個(gè)島位于第Xi行Yi列(設(shè)其坐標(biāo)為(Xi,Yi))的格子(Xi,Yi均為整數(shù),并且滿足1<=Xi,Yi<=M),島上藏有價(jià)值財(cái)富Vi(1<=Vi<=10,000)。湖的左上角(1,1)和右下角(M,M)都有島,有橋?qū)⑺鼈兣c陸地相連。

jyy沒費(fèi)多大勁,就找到了那個(gè)湖,同時(shí)哭笑不得地發(fā)現(xiàn),所謂的財(cái)富,是各個(gè)島上出產(chǎn)的珍稀水果。jyy 在左上角的島的岸邊找到了一條小木船,他可以劃船到其他島上去。劃船是要消耗體力的,具體地說,等于兩島 Euclidean 距離的平方(即,從(X1,Y1)劃船到(X2,Y2)所耗費(fèi)的體力為(X1-X2)^2+(Y1-Y2)^2個(gè)單位)。jyy可以吃水果來恢復(fù)體力,吃掉1單位價(jià)值的水果能恢復(fù)1單位體力。

現(xiàn)在jyy打算從(1,1)旅行到(M,M),沿途收集珍稀水果。按藏寶圖上的提示,jyy 離開一個(gè)島后,就只能去該島右下方的區(qū)域(正下和正右方向也是允許的),否則會(huì)遭遇水怪。jyy可以在旅行途中餓一段時(shí)間,即體力為負(fù)。但抵達(dá)終點(diǎn)后,只要身邊有足夠多的水果,他就會(huì)通過吃水果將體力恢復(fù)到旅行前的水平。

jyy想知道,經(jīng)過一次旅行,他最多能得到多少收益,即jyy收集到的水果總價(jià)值-jyy在旅途中花的總體力。(如果吃完所有水果他還餓著,收益就是負(fù)數(shù),具體的例子見樣例)

輸入輸出格式

輸入格式:

?

第1行:兩個(gè)整數(shù)N,M。第2..N+1行:每行3個(gè)整數(shù),第i+1行的3個(gè)整數(shù)分別為Xi,Yi,Vi。每個(gè)島的坐標(biāo)不同。保證存在坐標(biāo)(1,1)和(M,M)的島。

?

輸出格式:

?

第1行:輸出一個(gè)整數(shù),表示最大收益。

?

輸入輸出樣例

輸入樣例#1:?復(fù)制 4 10 1 1 20 10 10 10 3 5 60 5 3 30 輸出樣例#1:?復(fù)制 -4

說明

20+60+10-((3-1)^2+(5-1)^2)-((10-3)^2+(10-5)^2)=-4

對20%的數(shù)據(jù)M<=200,且N<=2,000

對50%的數(shù)據(jù)M<=200,且N<=20,000

對100%的數(shù)據(jù)M<=1000,且N<=200,000

題解

  話說斜率優(yōu)化的題解好玄學(xué)orz->這里

  考慮$dp_i$為走到$i$點(diǎn)的最大收益,則轉(zhuǎn)移方程為$dp_i=max\{dp_j-(x_i-x_j)^2-(y_i-y_j)^2\}+w_i$

  如果直接轉(zhuǎn)移的話是$O(n^2)$的,然而這里有一個(gè)特性,同一列中能轉(zhuǎn)移的點(diǎn)肯定是行數(shù)大的更優(yōu)

  為啥咧?從行數(shù)小的點(diǎn)先走到行數(shù)大的再走到該點(diǎn)在豎直方向上花費(fèi)為$a^2+b^2$,直接走到該點(diǎn)在豎直方向上的花費(fèi)為$(a+b)^2$,他們水平方向上的花費(fèi)一樣,那么肯定先走到行數(shù)大的點(diǎn)的花費(fèi)會(huì)更小

  然后據(jù)說這樣就能用$O(nm)$卡過去了

  然而這和斜率優(yōu)化有什么關(guān)系么?(沒有)

  設(shè)$dp_{i,j}$表示走到$(i,j)$的最大收益,我們可以枚舉從哪一列轉(zhuǎn)移到這里。因?yàn)橹灰_定了列就可以確定行,我們設(shè)$pos_i$表示第$i$列能轉(zhuǎn)移點(diǎn)的最大行數(shù),$x$為當(dāng)前點(diǎn)行數(shù),省略$dp$數(shù)組的第一維,設(shè)$dis_j=(x-pos_j)^2$,則有$$dp_i=max\{dp_j-dis_j-(i-j)^2+w_{x,i}\}$$

  設(shè)$j<k$且從$k$轉(zhuǎn)移比從$j$轉(zhuǎn)移更優(yōu),則有$$dp_j-dis_j-(i-j)^2<dp_k-dis_k-(i-k)^2$$

  $$dp_i-dp_k-dis_j+dis_k-j^2+k^2<2*i*(k-j)$$

  $$\frac{dp_i-dp_k-dis_j+dis_k-j^2+k^2}{(k-j)*2}<i$$

  然后就可以斜率優(yōu)化了……雖然基本都是抄的但還是累死我了……

  順便注意如果$j=k$的時(shí)候斜率返回$inf$或$-inf$

1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 inline int read(){ 9 #define num ch-'0' 10 char ch;bool flag=0;int res; 11 while(!isdigit(ch=getc())) 12 (ch=='-')&&(flag=true); 13 for(res=num;isdigit(ch=getc());res=res*10+num); 14 (flag)&&(res=-res); 15 #undef num 16 return res; 17 } 18 const int N=1005,inf=0x3f3f3f3f; 19 int n,m,h,t,x,y,q[N]; 20 int dp[N][N],w[N][N],pos[N],dis[N]; 21 inline double slope(int x,int y){ 22 return x==y?-inf:1.0*(dp[pos[x]][x]-dp[pos[y]][y]-dis[x]+dis[y]-x*x+y*y)/2/(y-x); 23 } 24 int main(){ 25 //freopen("testdata.in","r",stdin); 26 n=read(),m=read(); 27 for(int i=1;i<=n;++i) x=read(),y=read(),w[x][y]=read(); 28 memset(dp,0xef,sizeof(dp)); 29 dp[1][1]=w[1][1],pos[1]=1,w[1][1]=0; 30 for(int i=1;i<=m;++i){ 31 for(int j=1;j<=m;++j) dis[j]=(pos[j]!=0)*(pos[j]-i)*(pos[j]-i); 32 h=1,t=0; 33 for(int j=1;j<=m;++j){ 34 if(pos[j]){ 35 while(h<t&&slope(q[t-1],q[t])>slope(q[t],j)) --t; 36 q[++t]=j; 37 } 38 if(w[i][j]){ 39 while(h<t&&slope(q[h],q[h+1])<j) ++h; 40 dp[i][j]=dp[pos[q[h]]][q[h]]-dis[q[h]]-(q[h]-j)*(q[h]-j)+w[i][j]; 41 pos[j]=i,dis[j]=0; 42 while(h<t&&slope(q[t],q[t-1])>slope(q[t],j)) --t; 43 q[++t]=j; 44 } 45 } 46 } 47 printf("%d\n",dp[m][m]); 48 return 0; 49 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/bztMinamoto/p/9548191.html

總結(jié)

以上是生活随笔為你收集整理的bzoj1560:[JSOI2009]火星藏宝图(斜率优化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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