JSOI2018 防禦網路

2022-05-23 22:18:10 字數 1237 閱讀 3845

題面

題解這道題對我來說意義重大,是我花了很長時間獨立完成的dp。

分析題目

給出乙個仙人掌,對於乙個點集$s$,把原圖中使他聯通的最小的邊集記做$h(s)$,

求$\sum_ |h(s)|$

從考慮邊的貢獻的思路開始。

對於非環邊,假設它把$v$分成了$s$和$t$兩個區域,如果它被使用,當且僅當其中存在兩個點$a,b$ 使得 $a \in s b \in t$,統計$s$和$t$集合中元素的個數即可。

對於環邊,我們把它放到環中考慮,環上如果有邊,則邊一定是連續的(若不連續,子圖不能聯通)

那麼對於乙個環點的子集,這個連續的邊的區間該怎麼選?

找到其中最大的空缺,把環的長度去掉空缺的長度,即為答案區間。

所以貢獻與最大的空缺有關。

設$f[x][y]$為從起點到$x$點,起點一定選,並且$x$點一定選,最大的空缺長度為$y$ 的集合個數是多少。

顯然可以得到 $f[x][y] = (\sum_ f[i][y] + \sum_

stack

s;struct

graph

void tarjan(int

x)

else

++tot; int t,pret=x;

do pret=t;

}while (t!=y);

c[tot].push_back(x); cir[id[x][i]]=tot;}}

}}void tonji(int x,int ff1,int ff2,int &cnt)

}} g;

ll f[n][n],sumh[n][n],sums[n][n];

ll sh(

int x,int

y) void dp(int lent,int cur,int

start)

}}ll pow(ll a,

intn)

intmain()

g.cnt=0; g.tarjan(1

);

for (ri i=1;i<=m;i++) if (cir[i]==0

)

for (ri i=1;i<=tot;i++)

for (ri j=0;j) dp(myn,i,j);

} printf(

"%lld

",ans*1ll*pow(pp[n],inf-2)%inf);

return0;

}

JSOI2018 絕地反擊

loj 明顯是二分答案.首先考慮每乙個點在乙個時間內能夠到達的點是乙個圓,那麼如果圓和大圓相離,顯然不行.現在考慮有交,你取的一定是兩個端點中的乙個,接著你就可以發現這個東西可以網路流.唯一的問題在於,你需要考慮這段區間外要把這個匹配刪除,那麼可以考慮模擬退流的過程.include include ...

JSOI2018 軍訓列隊

n n le5 times10 5 個學生排成一排,第 i 個學生的位置為 a i m m le5 times10 5 次命令,每次將編號在 l,r 之間的學生移動到 k,k r l 位置上,每個位置站乙個人,順序自定 無需考慮原來在 k,k r l 位置上的人 每次的代價為每個人移動距離之和。求每...

JSOI2018 潛入行動

題目 我好菜啊,嚶嚶嚶 原來本地訪問陣列負下標不會報 re 或者 wa 甚至能跑出正解啊 這道題還是非常呆的 我們發現 k 很小,於是斷定這是乙個樹上揹包 發現在乙個點上安裝控制器並不能控制這個點,可能需要到父親那邊才能控制這個點,於是我們設 dp i j 0 1 0 1 表示在以 i 為根的子樹裡...