bzoj2597 Wc2007 剪刀石頭布

2022-05-01 06:27:10 字數 2627 閱讀 7128

time limit: 20 sec  memory limit: 128 mbsec  special judge

submit: 1765  solved: 763

[submit][status][discuss]

在一些一對一遊戲的比賽(如下棋、桌球和羽毛球的單打)中,我們經常會遇到a勝過b,b勝過c而c又勝過a的有趣情況,不妨形象的稱之為剪刀石頭布情況。有的時候,無聊的人們會津津樂道於統計有多少這樣的剪刀石頭布情況發生,即有多少對無序三元組(a, b, c),滿足其中的乙個人在比賽中贏了另乙個人,另乙個人贏了第三個人而第三個人又勝過了第乙個人。注意這裡無序的意思是說三元組中元素的順序並不重要,將(a, b, c)、(a, c, b)、(b, a, c)、(b, c, a)、(c, a, b)和(c, b, a)視為相同的情況。

有n個人參加一場這樣的遊戲的比賽,賽程規定任意兩個人之間都要進行一場比賽:這樣總共有場比賽。比賽已經進行了一部分,我們想知道在極端情況下,比賽結束後最多會發生多少剪刀石頭布情況。即給出已經發生的比賽結果,而你可以任意安排剩下的比賽的結果,以得到盡量多的剪刀石頭布情況。

輸入檔案的第1行是乙個整數n,表示參加比賽的人數。

之後是乙個n行n列的數字矩陣:一共n行,每行n列,數字間用空格隔開。

在第(i+1)行的第j列的數字如果是1,則表示i在已經發生的比賽中贏了j;該數字若是0,則表示在已經發生的比賽中i敗於j;該數字是2,表示i和j之間的比賽尚未發生。數字矩陣對角線上的數字,即第(i+1)行第i列的數字都是0,它們僅僅是佔位符號,沒有任何意義。

輸入檔案保證合法,不會發生矛盾,當i

≠j時,第(i+1)行第j列和第(j+1)行第i列的兩個數字要麼都是2,要麼乙個是0乙個是1。

輸出檔案的第1行是乙個整數,表示在你安排的比賽結果中,出現了多少剪刀石頭布情況。

輸出檔案的第2行開始有乙個和輸入檔案中格式相同的n行n列的數字矩陣。第(i+1)行第j個數字描述了i和j之間的比賽結果,1表示i贏了j,0表示i負於j,與輸入矩陣不同的是,在這個矩陣中沒有表示比賽尚未進行的數字2;對角線上的數字都是0。輸出矩陣要保證合法,不能發生矛盾。

30 1 2

0 0 2

2 2 0

10 1 0

0 0 1

1 0 0

100%的資料中,n≤ 100。

分析:挺妙的一道題!

直接想怎麼構造最多的三元組很難. 反向思考. 用總的三元組的個數-最少的不合法的三元組的個數即為所求.

關鍵就是如何使得不合法的三元組最少. 

首先要知道不合法的三元組有什麼特徵.畫個圖可以發現:乙個不合法的三元組中必然有乙個點,另外兩個點指向它.那麼答案就是

。第一部分是乙個定值,關鍵就是要使得第二部分最小.

每一條沒有確定方向的邊都只會對它連著的某乙個點產生貢獻,可以用容量表示數量的限制. 那麼貢獻是多少呢?

仔細分析,可以發現這其實是乙個貢獻遞增的模型,類似bzoj1449,bzoj1070.每條邊的費用只需要設為這一次的增量即可.

最後輸出方案列舉每條邊看是否滿流即可.

反向思考是很重要的技巧!遇到這類問題,要求的東西的條件非常多/複雜,減去不符合條件的即可.

tips:bzoj的spj好像有點問題?我的程式和標準輸出會有差異,過了洛谷的官方資料在bzoj上會wa掉.

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn = 110,maxm = 200010,inf = 0x3f3f3f3f,maxx = 20000

;int n,a[maxn][maxn],pos[maxn][maxn],ans,s,t,tot = 2

,cnt;

inthead[maxm],to[maxm],nextt[maxm],w[maxm],cost[maxm];

intvis[maxm],vis2[maxm],d[maxm];

void add(int x,int y,int z,int

p)void

pre()

if (a[i][j] == 1 || a[i][j] == 2

)

}}bool

spfa()}}

}return d[t]

}int dfs(int u,int

f)

int res = 0

; vis2[u] = 1

;

for (int i = head[u]; i; i =nextt[i])

}return

res;

}void

dinic()

intmain()

printf("\n

");}

return0;

}

bzoj2597 Wc2007 剪刀石頭布

今天注意力明顯不集中哎 頹 1a 了這道網路流題,思路確實神。題目是給你一張有向圖,讓你新增一些邊使得任意兩個點 a,b 直接都有一條有向邊,可以從a指向b,也可以由b指向a。讓你最大化三元環的數目。according to 姜爺,用補集思想,環不好搞,考慮三個點不成環,那那就是有乙個點連向其它的兩...

bzoj2597 Wc2007 剪刀石頭布

直接求不好求引入未知數,考慮採用補集轉化 對於一次非剪刀石頭布的情況,定是乙個人贏了另兩個人 若知道乙個人共贏了多少人,那麼就貢獻了n n 1 2種不同的情況 更一般的,乙個人如果多贏了乙個人,他的新增的貢獻就是他當前沒有加上這個人時已經贏了的人 費用流。st 比賽 人 ed,費用是遞增的,對於人拆...

BZOJ2597 WC2007 剪刀石頭布

在一些一對一遊戲的比賽 如下棋 桌球和羽毛球的單打 中,我們經常會遇到a勝過b,b勝過c而c又勝過a的有趣情況,不妨形象的稱之為剪刀石頭布情況。有的時候,無聊的人們會津津樂道於統計有多少這樣的剪刀石頭布情況發生,即有多少對無序三元組 a,b,c 滿足其中的乙個人在比賽中贏了另乙個人,另乙個人贏了第三...