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 處時,下一步走到的城...