NOI2019 序列 貪心,模擬費用流

2021-09-25 10:17:18 字數 1340 閱讀 9972

傳送門

首先你需要知道網路流的建圖方法,偷一張圖

我開始沒有想到怎麼限制 l 個相同,我們何不先選出 k 對,然後把 k 對拆開調整兩邊的最**擇

新建兩個點 c,d 來給兩邊調整的空間

我們可以模擬這個網路流的運作過程

類似某些貪心的題,用堆來維護最大之類的

我們可以記錄 cd 可以通過的流量 flow,如果 cd 有流量,我們就可以在兩邊分別選最大

如果沒有,我們可以選乙個a,保證b在對面出現,然後在對面隨便選乙個b

或者選乙個b, 保證a在對面出現,然後隨便選乙個 a

或者選一對最大的 a,b

我們發現 堆需要維護以下東西

沒有出現的 a, 沒有出現的 b,出現了b沒有出現的a, 出現了a沒有出現的b,ab都沒有出現的

然後就可以模擬了!

#include#define n 200050

using namespace std;

int read()

while(isdigit(ch)) cnt = (cnt << 1) + (cnt << 3) + (ch-'0'), ch = getchar();

return cnt * f;

}typedef long long ll;

int t, n, k, l, a[n], b[n];

int sta[n], id[n];

ll ans, flow;

struct a }tmp1;

struct b }tmp2;

struct ab }t***;

priority_queueq1, p1;

priority_queueq2, p2;

priority_queueq;

bool cmpa(int x, int y)

bool cmpb(int x, int y)

void init()

void prework(int x)

void pop()

void update1()

void update2()

if(s2 == mx)

if(s3 == mx)

}int main()

if(sta[i] == 1)

if(sta[i] == 2)

if(sta[i] == 3) flow++;

} while(l--) printf("%lld\n", ans);

} return 0;

}

NOI2019 序列(模擬費用流)

有兩個長度為n的序列,要求從每個序列中選k個,並且滿足至少有l個位置都被選,問總和最大是多少。1 leq l leq k leq n leq 2 10 5 首先,記錄當前考慮到的位置i,第乙個選的數量a,第二個選的數量b,都被選的數量c,可以做到 o n 4 卡常後能過 n leq 150 有40分...

NOI2019 序列(模擬費用流)

有兩個長度為n的序列,要求從每個序列中選k個,並且滿足至少有l個位置都被選,問總和最大是多少。1 leq l leq k leq n leq 2 10 5 首先,記錄當前考慮到的位置i,第乙個選的數量a,第二個選的數量b,都被選的數量c,可以做到 o n 4 卡常後能過 n leq 150 有40分...

NOI2019 序列 題解

同步賽當場降智了,認為貪心是假的。然後。就寫了個暴力。開題一看,這不是模擬費用流嗎?然而這個費用流並不顯然。所以我當時放棄了t3部分分沒想到。當然也希望這個題解能讓大家懂得什麼是真正的模擬費用流啦 大概是這麼一張圖 正確性嘛 就是如果選下標不同的一對數的話必須走 c d 這條路徑 那麼就保證了下標不...