bzoj2597 Wc2007 剪刀石頭布

2022-04-29 20:36:12 字數 1514 閱讀 4210

直接求不好求引入未知數,考慮採用補集轉化

對於一次非剪刀石頭布的情況,定是乙個人贏了另兩個人

若知道乙個人共贏了多少人,那麼就貢獻了n*(n-1)/2種不同的情況

更一般的,乙個人如果多贏了乙個人,他的新增的貢獻就是他當前沒有加上這個人時已經贏了的人

費用流。

st->比賽->人->ed,費用是遞增的,對於人拆點,一條一條不同費用的連

我真是震驚了暴力跑得比費用流還快。。。orz bzoj14年就踩崩這題的test_tset在discuss教我迭代

ta沒回我之前我腦洞大開寫了一發模擬退火,效果極差,我想了一手隨機處理2的順序直接貪心,發現和正確答案已經很接近了,導致退火完全跳不出來。。。

然後這個大佬的做法:

實踐中這個做法比我的網路流快了1倍不止(或許是修正主義在作祟???)

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int inf=(1

<<30

);struct

node

a[410000];int len,last[11000

];void ins(int x,int y,int c,int

d)int

st,ed;

int pre[11000],c[11000],d[11000

],ans;

int list[11000];bool v[11000

];bool

spfa()}}

v[x]=false

; head++;if(head==10500)head=1

; }

if(d[ed]==d[0])return

false

;

else

return

true

; }

}int mp[110][110],px[11000],py[11000

];int hw[110],hl[110

];int

main()

st=2*n+z+1,ed=2*n+z+2

;

for(int i=1;i<=z;i++)ins(st,2*n+i,1,0

);

for(int i=1;i<=n;i++)

while

(spfa());

printf(

"%d\n

",n*(n-1)/2*(n-2)/3-(ans+sum));

intx,y,g;

for(int i=2;i<=len;i+=2

)

if(a[i].x>2*n&&a[i].x<=2*n+z)

for(int i=1;i<=n;i++)

return0;

}

bzoj2597 Wc2007 剪刀石頭布

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

bzoj2597 Wc2007 剪刀石頭布

time limit 20 sec memory limit 128 mbsec special judge submit 1765 solved 763 submit status discuss 在一些一對一遊戲的比賽 如下棋 桌球和羽毛球的單打 中,我們經常會遇到a勝過b,b勝過c而c又勝過a...

BZOJ2597 WC2007 剪刀石頭布

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