ccf201703 5 引水入城

2021-08-27 23:57:43 字數 3047 閱讀 1292

問題描述

mf城建立在一片高原上。由於城市唯一的水源是位於河谷地帶的湖中,人們在坡地上修築了一片網格狀的抽水水管,以將湖水抽入城市。如下圖所示:

這片管網由 n 行 m 列節點(紅色,圖中 n = 5,m = 6),橫向管道(紫色)和縱向管道(橙色)構成。

行和列分別用 1 到 n 的整數和 1 到 m 的整數表示。第 1 行的任何乙個節點均可以抽取湖水,湖水到達第 n 行的任何乙個節點即算作引入了城市。

除第一行和最後一行外,橫向相鄰或縱向相鄰的兩個節點之間一定有一段管道,每一段管道都有各自的最大的抽水速率,並需要根據情況選擇抽水還是放水。對於縱向的管道(橙色),允許從上方向下方抽水或從下方向上方放水;如果從圖中的上方向下方抽水,那麼單位時間內能通過的水量不能超過管道的最大速率;如果從下方向上方放水,因為下方海拔較高,因此可以允許有任意大的水量。對於橫向的管道(紫色),允許從左向右或從右向左抽水,不允許放水,兩種情況下單位時間流過的水量都不能超過管道的最大速率。

現在mf城市的水務負責人想知道,在已知每個管道單位時間容量的情況下,mf城每單位時間最多可以引入多少的湖水。

輸入格式

由於輸入規模較大,我們採用偽隨機生成的方式生成資料。

每組資料僅一行包含 6 個非負整數 n, m, a, b, q, x0。其中,n 和 m 如前文所述,表示管網的大小,保證 2 ≤ n, m ≤ 5000;保證 1 ≤ a, b, q, x0 ≤ 109。

a, b, q, x0 是資料生成的引數,我們用如下的方式定義乙個數列 :

xi+1 = ( axi + b) mod q, (i ≥ 0)

我們將數列的第 1 項到第 (n-1)m 項作為縱向管道的單位時間容量,其中 x(s-1)m+t 表示第 s 行第 t 列的節點到第 s+1 行第 t 列管道單位時間的容量;將數列的第 (n-1)m+1 項到第 (n-1)m+(n-2)(m-1) 項(即接下來的 (n-2)(m-1) 項)作為橫向管道的單位時間容量,其中 x(n-1)m+(s-2)(m-1)+t 表示第 s 行第 t 列的節點到第 s 行第 t+1 列管道單位時間的容量。

輸出格式

輸出一行乙個整數,表示mf城每單位時間可以引入的水量。

注意計算過程中有些引數可能超過32位整型表示的最大值,請注意使用64位整型儲存相應資料。

樣例輸入

3 3 10 3 19 7

樣例輸出

38樣例輸入

2 5 595829232 749238243 603779819 532737791

樣例輸出

1029036148

樣例輸入

5 2 634932890 335818535 550589587 977780683

樣例輸出

192923706

樣例輸入

5 5 695192542 779962396 647834146 157661239

樣例輸出

1449991168

時間限制:2.0s

記憶體限制:512.0mb

很容易看出這是乙個網路流最大流的模型,以湖為源點,城市為匯點按要求建圖即可,但有乙個問題,那就是資料規模,極限資料下m==5000,n==5000,這麼一來就相當於有2.5*1e7個點,並且邊數是點數的三四倍左右,這樣建圖肯定會mle,就算記憶體夠大,2s的時間限制也會導致程式tle,所以網路流是過不了這道題的所有資料的,經過仔細觀察後發現,這些圖點都是層次分明的,而且n行的點的水流的最大值與n-1行有關,貌似可以用dp?

博主首先嘗試了一下dinic,加了多路增廣及炸點優化依然只得了60分,後面的資料t掉了。先留個坑,去研究一下dp的做法,回來補上。

首先講幾個潛在的坑(或者說審題不仔細弄錯的地方)

1.橫向邊是無向邊,意味著正邊和反邊flow一樣。

2.縱向邊從上往下有限制,從下往上沒有限制。

然後是60分的網路流**:

#include

#include

#include

#define rep(i,x,n) for(ll i=x;i#define per(i,x,n) for(ll i=n-1;i>=x;i--)

#define nxt(x) x=((a*x)+b)%q

using

namespace

std;

//head

typedef

long

long ll;

const ll maxn=5e6,ha=1

<<30;

int n,m,num,head[maxn],flag[maxn],cur=0,t;

ll x,a,b,q;

struct edgeedge[6*maxn];

void addedge(ll q,ll w,ll x)

void addedge1(ll q,ll w,ll x)

void addedge2(ll q,ll w,ll x)

int bfs()

}return flag[t];

}ll dfs(ll fl,int num)

}if(!f)flag[num]=-2;

return f;

}ll maxflow()

return ret;

}int main()

rep(i,1,m+1)

rep(i,0,n-1)rep(j,1,m+1)

rep(i,1,n-1)rep(j,1,m)

cout

0;}

NOIP2010 引水入城

兩遍bfs floodfill,第一遍bfs可以判斷出最後是輸出0還是輸出1,第二遍bfs floodfill不懂 program flow const dx array 1.4 of 1.1 1,0,1,0 dy array 1.4 of 1.1 0,1,0,1 type atp record x...

VIJOS P1777引水入城

描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n行m列的矩形,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利...

NOIP2010 引水入城

4引水入城在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水...