A C 2007 資料備份(網路流,堆)

2022-05-06 16:09:07 字數 887 閱讀 4786

給你n各點的位置和k條鏈,需要用這些鏈把2k個點連起來,使得鏈的總長最短。可以隨意選擇要鏈的點。n=100000。

這道題居然可以用堆……

首先,不能把區間一股腦加進去,因為有點可能會被重複連線。處理方法是這樣的:若選擇了第i個區間,那就把i,區間i-1和區間i+1都刪除了,然後加入乙個新區間,和左右區間相連線,並且將當前區間的值改為\(len[i-1]+len[i+1]-len[i]\)。這樣如果再選這個區間,就相當於把區間i撤消了。

具體證明嘛,見這個blog,講道理我是不想看。。

// luogu-judger-enable-o2

// luogu-judger-enable-o2

#include using namespace std;

typedef long long ll;

const ll maxn=1e5+5, inf=1e18;

ll n, k, a[maxn];

struct node

ll v, chain;

}node[maxn]; //維護鏈長的最小堆

bool operator <(node &a, node &b)

}void del(ll now)

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

return x*f;

}long long ans=0;

int n,k,ne[mn+5],la[mn+5],a[mn+5],len[mn+5];

bool del[mn+5];

priority_queue,greater> q;

int main()

cout

}

CTSC 2007 資料備份

題目鏈結 演算法 首先,有乙個很顯然的結論 如果要使距離和最小,必須選擇相鄰的辦公樓配對 問題就轉化為了 有乙個包含 n 1 個數的序列,在這 n 1 個數中選k個,相鄰的數不能選,使得和最小 考慮這個序列中最小的元素,我們發現,如果選這個數,那麼與它相鄰的兩個數都不能選,如果不選,那麼與它相鄰的兩...

APIO CTSC 2007 資料備份

嘟嘟嘟 這竟然是一道貪心題,然而我在不看題解之前一直以為是dp。首先最優的配對一定是相鄰兩個建築物配對,所以我們求出差分陣列,就變成了在n 1個數中選出不相鄰的k個數,使這k個數的和最小。貪心是在回事呢?首先把所有點放在乙個小根堆中,然後如果取出乙個點ai,就把ai 1 ai 1 ai放到小根堆中,...

APIO CTSC 2007 資料備份

真正的貪心好題 一段區間被取後,旁邊兩端區間不能再取,但我們可以捨棄掉這一段,去取旁邊的兩段 這樣的貪心策略怎麼維護呢?我們用堆維護貪心,每次選擇這段區間後,將兩邊的區間合併成一段,權值是 w w w i 也就是捨棄中間這一段,取兩邊的 但是這樣的做法只能做一次捨棄,事實上我們可能會有多次,然而我們...