P1081 開車旅行

2022-04-30 00:51:22 字數 2075 閱讀 5187

p1081 開車旅行

排序優化+倍增

其實這道題一開始是一點也沒有頭緒,知道有高人指點了一下。說並不需要拘束於出發點和路徑長度,也就是問題1.2。不過乙個是固定路徑長度的詢問,另乙個是給定起點和路徑長度的詢問。

所以問題一和問題二是可以使用乙個函式解決的,而且對於乙個城市來說,在不考慮路程的情況下,路線是一定的。

然後我們就可以從遍歷圖變成列舉終點然後判斷路程是否合法。

然後為了加速就可以使用倍增處理

對於每個城市,我們需要找他的最近點和次近點。o(n^2)會超時,這時候我們就需要優化可以考慮雙向鍊錶進行優化。

我們先按海拔進行排序,然後將標號為1的點拿出來進行處理,顯然,只有在鍊錶中的左右相鄰的兩個的城市(乙個方向)才有可能是滿足條件的點

然後再將處理完最近和次近的點在鍊錶中刪除(因為路徑方向是有序的),這時候標號為2的點就成了標號為1的點,這樣就可以了。

每次詢問,使用倍增進行摸♂索

#include#include#include#include#includeusing std::sort;

using std::abs;

const int maxn=101000;

struct node

;node city[maxn];

int pos[maxn];

long long dis[maxn][2];

int to[maxn][2];

int stf[maxn][20];

long long sta[maxn][20];

long long stb[maxn][20];

int n;

bool compare(const node &a,const node &b)

while(c>='0'&&c<='9')

return res*f;

}void make_dis(int i,int j)

else if(b>pas||(b==pas&&city[d].y>city[l].y))

}for(int r=city[j].r,k=1;r<=n&&k<=2;r=city[r].r,k++)

else if(b>pas||(b==pas&&city[d].y>city[r].y))

}//不大會寫這種東西

city[city[j].l].r=city[j].r;

city[city[j].r].l=city[j].l;

dis[i][0]=(a == 0x7fffffff ? 0 : a);

dis[i][1]=(b == 0x7fffffff ? 0 : b);

to[i][0]= ( c == -1 ? 0 : city[c].x );

to[i][1]= ( d == -1 ? 0 : city[d].x );

}void make_st()

for(int i=1;i<=19;i++)

for(int j=1;j<=n;j++)

}void query(int k,int x,long long &a,long long &b)

if(a+b+dis[k][1]<=x)

a+=dis[k][1];

return ;

}int main()

sort(city+1,city+1+n,compare);//按照海拔排序

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

make_dis(i,pos[i]);

make_st();

int x=read();

long long a1=-0x7fffffff,a2=-0x7fffffff;

long long m1=0,m2=0;

double minn=0x7fffffff;

for(int i=1;i<=n;i++)

}printf("%d\n",a2);

int m=read(),s;

for(int i=1;i<=m;i++)

return 0;

}

P1081 開車旅行

傳送門 用倍增的思想 設 a i 表示a在 i 位置走一步到達的城市以及經過的路程 這裡我用結構體存a i b同理 設 f i j 表示從 i 位置出發,走 2 j 輪後到達的城市 一輪即ab各走一次 dis i j 表示從 i 位置出發,走 2 j 輪後經過總路程 da i j 表示從 i 位置出...

洛谷 P1081 開車旅行

題目描述 小 a 和小 b 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為hi,城市 i 和城市 j 之間的距離 d i,j 恰好是這兩個城市海拔高度之差的絕對值,即d i,j hi hj ...

P1081 開車旅行 倍增 (毒瘤題)

其實就是個大模擬。首先,根據題意,小a和小b從任意乙個城市開始走,無論 x 如何,其路徑是一定唯一的。顯然對於兩問都可以想出乙個 o n 2 的暴力,即直接一步一步地向右走。首先,我們當然需要知道a,b在每個城市的下一步如何走,記 nexta i nextb i 為a,b在 i 處時,下一步走到的城...