zrq在洞穴中準備採集礦物的時候遇險了!洞穴要塌了!
整個洞穴是乙個 \(n*n\) 的方格圖,每個格仔形如 \((x,y),1 \le x,y \le n\) 。其中 \(x\) 表示從上到下的行數,\(y\) 表示從左到右的列數。 \((1,1)\) 在左上角,\((1,n)\) 在右上角, \((n,1)\) 在左下角, \((n,n)\) 在右下角。
滿足 \(x+y\) 為奇數格仔的有乙個不穩定度 \(v_\) , \(x+y\) 為偶數的格仔的不穩定度為 \(0\) 。
zrq現在手裡恰巧有 \(m\) 個可以支撐洞穴的柱子,柱子的力量可以認為是無窮大。
只要支撐住了乙個格仔那麼這個格仔的不穩定度將降為 \(0\) 。
每個柱子是 \(l\) 型的,它除了要佔據當前的格仔外,還需要佔據兩個相鄰的格仔(這三個格仔形成 \(l\) 型,可以選擇任意方向放置,一共有 \(4\) 個方向)。
柱子佔據相鄰的格仔不會降低其不穩定度(換句話說就是柱子只有在拐角處有力量)。
有些格仔的頂已經塌下來了,無法在其位置放置柱子了,這些格仔也不能被佔據了。這樣已經塌了的格仔有 \(k\) 個(他們的不穩定度都為 \(0\) ,即使 \(x+y\) 為奇數,塌下來的格仔的不穩定度也會為 \(0\))。
zrq想問你,在放置一些柱子後 ,最小的不穩定度之和為多少(可以不將 \(m\) 個柱子都放完)。
輸入格式:
第一行三個整數 \(n,m,k\)
接下來 \(n\) 行每行 \(n\) 個整數,表示每個格仔的不穩定度,保證 \(x+y\) 為偶數的格仔和已經塌下的格仔的不穩定度為 \(0\)。
接下來 \(k\) 行每行 \(2\) 個整數 \(x,y\) ,表示已經塌下的格仔的座標。
輸出格式:
一行乙個整數,表示最小的不穩定度的和。
輸入樣例#1:
3 3 1
0 1 0
2 0 1
0 1 0
1 3
輸出樣例#1:
3
輸入樣例#2:
3 3 4
0 2 0
0 0 4
0 3 0
1 32 1
2 23 1
輸出樣例#2:
9
共 \(10\) 個測試點,每個點 \(10\) 分,計 \(100\) 分。
對於測試點 \(1\) ~ \(3\) ,有 \(1 \le n \le 6\)
對於測試點 \(4\) ~ \(7\) ,有 \(1 \le n \le 11\)
對於測試點 \(8\) ~ \(10\) ,有 \(1 \le n \le 50\)
對於所有測試點, \(0 \le m \le \frac, 0 \le k \le n^2, 0 \le v_ \le 10^6\)
樣例#1解釋:
顯然無法讓任意兩個不穩定的格仔都被拐角覆蓋,於是將 \((2,1)\) 用拐角覆蓋住即可。這樣剩餘的不穩定度為 \(v_+v_+v_=1+1+1=3\) 。
樣例#2解釋:
乙個都放不下,這樣剩餘的不穩定度為 \(v_+v_+v_=2+4+3=9\) 。
考慮費用流。為了方便描述,偶數格表示的是 為偶數的格仔,奇數格表示的是為奇數的格仔。
首先拐⻆處肯定放在有危險度的格仔上。然後可以把這個 'l' 形石頭看做是一條從奇數列的偶數格到奇數格再到偶數列的偶數格的一條路徑。於是建四列點,把奇數列的偶數格放在第一列,每個奇數格拆成兩個點分別放在第二列和第三列,偶數列的偶數格放在第四列。第一列到第二列是如果點是相鄰的則連容量為 \(1\) 費用為 \(0\) 的邊,第三列到第四列同理,第二列到第三列的相同點則連容量為 \(1\) 費用為負的危險度的邊,然後源點向第一列,第四列向匯點連容量為 \(1\) 費用為 \(0\) 的邊。
然後跑最小費用最大流,當此次增廣的費用是正的了或者增廣了次時就break,因為可能根本就放不下個石頭,後面增廣的費用是為了得到最大流而退流形成的,並不需要石頭越多越好,我們只希望費用最小。
#include#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int maxn=100+10,maxm=50000+10,inf=0x3f3f3f3f;
int n,m,k,e=1,beg[maxn*maxn*2],nex[maxm<<1],to[maxm<<1],cap[maxm<<1],was[maxm<<1],ans,g[maxn][maxn],t[maxn][maxn],prex[maxn*maxn*2],s,t,pres[maxn*maxn*2],m[4][maxn][maxn],tot,p[maxn*maxn*2],level[maxn*maxn*2];
std::queueq;
templateinline void read(t &x)
templateinline void write(t x,char ch='\0')
templateinline void chkmin(t &x,t y)
templateinline t min(t x,t y)
inline void insert(int x,int y,int z,int w)
inline bool bfs()
} return level[t]<0;
}inline void dfs()
int main()
for(register int i=1;i<=n;++i)
for(register int j=1;j<=n;++j)
if((i+j)&1)
else m[((i&1)?0:3)][i][j]=++tot;
s=++tot,t=++tot;
for(register int i=1;i<=n;++i)
for(register int j=1;j<=n;++j)
if(t[i][j])continue;
else if((i+j)&1^1)
else
}while(bfs()&&m--)dfs();
write(ans,'\n');
return 0;
}
洛谷 P2147 SDOI2008 洞穴勘測
p2147 sdoi2008 洞穴勘測 思路 按時間分治,然後每條邊有乙個存活時間段,按存活時間段將邊加入劃分樹,然後在劃分樹上分治,用可撤銷並查集維護連通性。pragma gcc optimize 2 pragma gcc optimize 3 pragma gcc optimize 4 incl...
洛谷P2147 SDOI2008 洞穴勘測
題目大意 有 n 個洞穴,m 條指令,指令有三種 connect u v 在 u,v 之間連一條邊 destroy u v 切斷 u,v 之間的邊 query u v 詢問 u,v 是否連通 資料保證合法 題解 lct 潘佳奇的板子 卡點 無 潘佳奇的板子 c code include includ...
洛谷刷題 P1003 鋪地毯
為了準備乙個獨特的頒獎典禮,組織者在會場的一片矩形區域 可看做是平面直角座標系的第一象限 鋪上一些矩形地毯。一共有 n 張地毯,編號從 1 到 n。現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成後,組織者想知道覆蓋地面某個點的最上面的那...