**巨長的倍增題...
顯然這是沒有什麼決策的,選擇方案都是固定的
這可以考慮倍增跳,每個位置上跳到的位置是可以通過查前驅後繼解決的
有兩種方式:
一種是平衡樹搞法,倒著做查完了插入
另一種是先排序建乙個鍊錶,查完了刪除
都是可以通過加哨兵節點來搞的,
結果我只想到了 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 恰好是這兩個...