首先,我採用反向建邊的方式建一dag圖,然後跑dfs(其實就是反的拓撲序),記憶化搜尋,算出f[i
]f[i]
f[i]
,即完成任務i
ii所需的最短時間.
#define usefasterread 1
#define rg register
#define inl inline
#define debug printf("[passing [%s] in line %d.]\n", __func__, __line__)
#define putline putchar('\n')
#define putsp putchar(' ')
#define rep(a, s, t) for(rg int a = s; a <= t; a++)
#define repdown(a, t, s) for(rg int a = t; a >= s; a--)
typedef
long
long ll;
#include
#define rs freopen("test.in", "r", stdin), freopen("test.out", "w", stdout)
#if usefasterread
char in[
1<<20]
,*ss = in,
*tt = in;
#define getchar() (ss == tt && (tt = (ss = in) + fread(in, 1, 1 << 20, stdin), ss == tt) ? eof : *ss++)
#endif
struct io
template
<
typename t>
inline io r
(t& x)
const
template
<
typename t>
inline io w
(t x)
const
if(x >=10)
w(x /10)
;putchar
(x %10+
'0')
;return
*this;}
template
<
typename t>
inline io wl
(const t& x)
const
template
<
typename t>
inline io ws
(const t& x)
const
inline io l()
inline io s()
}io;
template
<
typename t>
inline t max
(const t& x,
const t& y)
template
<
typename t>
inline t min
(const t& x,
const t& y)
template
<
typename t>
inline
void
swap
(t& x, t& y)
const
int inf =
0x7f7f7f7f
;const
int maxn =
10005
;const
int maxm =
10000005
;int n, len[maxn]
;struct edge
e[maxm]
;int cnt, head[maxn]
;void
addedge
(int u,
int v)
int f[maxn]
;//任務的最早結束時間
voiddp(
int u)
f[u]
+= maxt;
}int
main()
}for
(rg int i =
1; i <= n; i++)if
(!f[i])dp
(i);
int mint =
-inf;
for(rg int i =
1; i <= n; i++
) mint =
max(mint, f[i]);
io.wl(mint)
;return0;
}
LGOJ P5461 赦免戰俘
乙個 2n 2n 2 n times2 n 2n 2 n 的矩陣,每個位置站著乙個作弊者,每次將正方形矩陣分割成4個更小的正方形矩陣,每個矩陣的邊長是原矩陣的一半。其中左上角那乙個矩陣的所有作弊者都將得到赦免,剩下的三個矩陣中,每乙個矩陣繼續分為 4 個更小的矩陣,然後以同樣的方式分割矩陣,以同樣的...
LGOJ P1018 乘積最大
lgoj p1018 乘積最大 首先不難想到狀態轉移方程 f i j max s in 0,i i in 1,n j in 1,k f i j 表示在 i 位置時已經用了 j 個乘號,表示當前的最大值。calc l,r 表示從 l 位置到 r 位置表示的數。數的全部型別都是bigint。不高精度會炸...
LGOJ P5463 小魚比可愛
by zhongzijun text zhongzijun 這是小魚比可愛的加強版。給你乙個正整數 n nn 和乙個序列 a 1a 1 a1 a na n an 定義 f i j f i,j f i,j 表示序列 a aa 在 l,r l,r l,r 內的逆序對對數。現在請你求出 i 1n j i ...