Luogu1081 開車旅行

2022-07-24 00:03:24 字數 1939 閱讀 7067

**巨長的倍增題...

顯然這是沒有什麼決策的,選擇方案都是固定的

這可以考慮倍增跳,每個位置上跳到的位置是可以通過查前驅後繼解決的

有兩種方式:

一種是平衡樹搞法,倒著做查完了插入

另一種是先排序建乙個鍊錶,查完了刪除

都是可以通過加哨兵節點來搞的,

結果我只想到了 set 亂搞,就寫了很長

預處理完就可做了

第一問對於每個點倍增一遍,其實就是照題意模擬,倍增優化一下

第二問還是照題意模擬,倍增優化一下

暴力有 70pts ?

**:

#include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int max_n = 100005;

const double inf = 100000000000001.0;

struct node

bool operator < (const node& b) const

};struct pair

friend pair operator + (pair a, pair b)

}d[max_n][20][2];

int n, lg, x0, m, ans;

int h[max_n], f[max_n][20][2];

double ans_rat;

setst;

inline int rd()

while (isdigit(c))

return f ? -x : x;

}inline void get_for(int pos, set::iterator iter) else if (iter == st.end())

++rig;

if (rig == st.end()) else

return;

} if (abs(h[pos] - h[lef->id]) <= abs(h[pos] - h[iter->id])) else

return;

} f[pos][0][0] = iter->id;

d[pos][0][0].fir = abs(h[pos] - h[iter->id]);

f[pos][0][1] = lef->id;

d[pos][0][1].sec = abs(h[pos] - h[lef->id]);

return;

} --lef;

if (abs(h[pos] - h[lef->id]) == abs(h[pos] - h[iter->id])) else if (abs(h[pos] - h[lef->id]) < abs(h[pos] - h[iter->id])) else else

} } else else }}

inline void dbl_init()

st.insert(node(h[i], i));

} for (int i = 1; i <= n && 2 + i <= n; ++i)

for (int j = 2; j <= lg; ++j) }}

inline void get_ans(int bgn)

if (!got_bgn) return;

if (dst_b == 0) else

if (fabs(0.0 - ans_rat) < 1e-7 || rat < ans_rat || (fabs(rat - ans_rat) < 1e-7 && h[bgn] > h[ans]))

}int main()

printf("%lld %lld\n", tot_a, tot_b);

} return 0;

}

luogu1081 開車旅行

這個題目還是值得思考的.看到這個題目,大家應該都想到了這樣乙個思路,就是把每個點能夠達到的最近的和次近的點都預處理出來,然後跑就可以了,現在問題就是難在這個預處理上面,我們應該如何做呢?觀察到,近的概念是兩點之間的海拔距離最小,所以我們可以將海拔距離從後往前 畢竟你只能往你後面的地方走嘛.扔進乙個可...

倍增 luogu1081開車旅行

傳送門 倍增神題?細節超級多 其實思路很簡單 對於每個點,a和b要開去的目的地是固定的,所以就想到了倍增 開三個倍增陣列,t i j k 代表k從i開車走2 j天走到的那個城市 f是a走的路程,g是b走的路程 0代表a,1代表b 對於預處理,一開始怎麼想怎麼是n 2的 後來自己yy了一下覺得每次so...

luogu p1081 開車旅行

傳送門 此題為複雜細節題,無法總結題意,所以給出原題 小 text 和小 text 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為 h i 城市 i 和城市 j 之間的距離 d 恰好是這兩個...