題目傳送門
提供兩種做法
正常連邊后,對于每個位置 \(i\) 都加上 \(i-1->i\) 和 \(i->i+1\) ,長度為 \(1\) 的邊,相當于先按照原方法走再改動。
不過題目中要求改動后的數必須是自然數(也就是正整數),所以不是所有點都可以加,必須逐個判斷能否改動。
然后跑一個堆優化Dijkstra即可。
$Code\ by\ $ @wsy_jim
%%%
#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cmath>#include<vector>#include<map>#include<queue>#include<deque>#include<set>#include<stack>#include<bitset>#include<cstring>#define ll long long#define pii pair<int,int>using namespace std;const int INF=0x3f3f3f3f,N=1000010;int e[4*N],ne[4*N],idx,h[N],w[4*N],n,ls[N],rs[N];inline int read(){ int x=0,y=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') y=-1;c=getchar();} while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x*y;}void add(int a,int b,int c){ e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;}namespace dijkstra{ int dist[N]; bool vis[N]; int dijkstra(int st,int ed){ memset(dist,0x3f,sizeof dist); priority_queue<pii,vector<pii>,greater<pii> > q; dist[st]=0; q.push(make_pair(0,st)); while(q.size()){ pii op=q.top(); q.pop(); int dis=op.first,ver=op.second; if(vis[ver]) continue; vis[ver]=1; for(int i=h[ver];~i;i=ne[i]){ int j=e[i]; if(dist[j]>dist[ver]+w[i]){ dist[j]=dist[ver]+w[i]; q.push(make_pair(dist[j],j)); } } } if(dist[ed]==0x3f) return -1; return dist[ed]; }}int main(){ memset(h,-1,sizeof h); n=read(); for(int i=1,k;i<=n;i++){ k=read(); if(i+k<=n) add(i,i+k+1,0); else add(i,n+1,i+k-n); for(int j=i+1;j<=i+k+1&&j<=n&&!ls[j];j++)ls[j]=1,add(j,j-1,1);for(int j=i+k+1;j<=n&&!rs[j];j++)rs[j]=1,add(j,j+1,1); } // for(int i=1;i<=n;i++){ // for(int j=h[i];~j;j=ne[j]) printf("%d %d ",e[j],w[j]); // printf("\n"); // } ll ans=dijkstra::dijkstra(1,n+1); printf("%lld\n",ans); return 0;}
設 \(f[i]\) 表示處理 \(i\) 到 \(n\) 的最優答案。
易得
把這個式子打開
\[f[i] = min(f[j]+j)-(i+1+a[i]) (j ≥ a[i]+i+1)\]\[f[i] = min(f[j]-j)+(i+1+a[i]) (j<a[i]+i+1)\]然后用樹狀數組維護 \(f[j]+j\) 和 \(f[j]-j\) 即可
\(Code\)
#include<algorithm>#include<bitset>#include<cctype>#include<cerrno>#include<clocale>#include<cmath>#include<complex>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<deque>#include<exception>#include<fstream>#include<functional>#include<limits>#include<list>#include<map>#include<iomanip>#include<ios>#include<iosfwd>#include<iostream>#include<istream>#include<ostream>#include<queue>#include<set>#include<sstream>#include<stack>#include<stdexcept>#include<streambuf>#include<string>#include<utility>#include<vector>#include<cwchar>#include<cwctype>#include<chrono>#include<random>#include<unordered_map>using namespace std;#define ll long long#define ull unsigned long long#define rll register long long#define ri register int#define il inline//#define int long longconst int INF=0x3f3f3f3f,N=1e6+10;int n,t;int ins[N];int f[N];int t1[N],t2[N];il ll read(){ ll x=0,y=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') y=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } return x*y;}il int lowbit(int x){ return x&(-x);}il int query1(int x){ int mid=INF; x=(n+1)-x; if(x>n||x<=0) return mid; while(x){ mid=min(mid,t1[x]); x-=lowbit(x); } return mid;}il int query2(int x){ int mid=INF; if(x>n||x<=0) return mid; while(x){ mid=min(mid,t1[x]); x-=lowbit(x); } return mid;}il void wh(int x){ int mid=x; while(mid<=n){ t2[mid]=min(t2[mid],f[x]-x); mid+=lowbit(mid); } mid=(n+1)-x; while(mid<=n){ t1[mid]=min(t1[mid],f[x]+x); mid+=lowbit(mid); }}signed main(){ n=read(); memset(t1,0x3f,sizeof(t1)); for(ri i=1;i<=n;i++) ins[i]=read(); for(ri i=n;i>=1;i--){ f[i]=abs(n-i-ins[i]); t=ins[i]+i+1; if(t<n) f[i]=min(f[i],query1(t)-t); f[i]=min(f[i],query2(t)+t); wh(i); } printf("%d",f[1]); return 0;}
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
QQ如何設置動態壁紙?聊q主菜單設置頁背景步驟::1、再點手機桌面圖標正常啟動軟件啊客服端。2、點擊上主菜單上的個人空間頭像,在直接出現的下拉菜單中再點“個性造型”。3、從自己的相冊中本地上傳動態百度圖片。4、再點“從我的相冊選擇背景設置”選項。5、在相冊文件夾中可以找到你要本地上傳的原圖并再點。6、用大拇指和食指在頻幕上劃動,移動手機和縮放比例圖片到理想什么狀態,最后直接點擊“能夠完成”,隨機打...
石家莊裝修建材市場有哪些?1.巨然李佳裝飾城(巨然李佳裝飾城位于石家莊市中華南街473號)2.西三莊建材市場(位于北二環與西三莊街交叉口)3.紅星美凱龍(建華街與和平路交叉口)4.好家園(東二環與和平路交叉口)5.岳明家園(淮安路高架橋以西)6.白色家居(體育街與東港路交叉口)7.陽光宜家建材廣場(和平東路430號)8.紅房子裝飾材料市場(槐中路與建設街交叉口)9.華業裝飾城(新華西路)10.岳明...
iPhone手機版微信一直顯示在收取中解決辦法?進入并將常規后臺應用程序設置為刷新并打開。關掉不用的,打開微信解決蘋果6的問題。微信收藏出現問題的可能原因如下:WiFi本身問題,WiFi可能連接不好,導致無法上網;路由器問題,路由器可能過熱或損壞;寬帶欠費,導致無法上網;WiFi名稱中含有中文,導致部分手機無法上網;手機系統出現問題,系統可能出現問題,導致無法上網連接WiFi,但無法上網。如何解決...