題面
題解這道題對我來說意義重大,是我花了很長時間獨立完成的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 為根的子樹裡...