傳送門
首先你需要知道網路流的建圖方法,偷一張圖
我開始沒有想到怎麼限制 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 這條路徑 那麼就保證了下標不...