給你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 也就是捨棄中間這一段,取兩邊的 但是這樣的做法只能做一次捨棄,事實上我們可能會有多次,然而我們...