小c的線段樹
題目背景:
1.12 wc
模擬t3
分析:dp
據說,這個玩意兒才是本場
t1······,考場上只想到乙個
nm2的暴力,就是,直接定義
f[i][l][r]
表示當前是第
i個區間,上乙個括號是
[l, r)
,這樣過掉了
k = 1
的部分。
考慮標算,注意到當
n > m
時,是不存在合法操作序列的,所以因為
nm <= 100000
,那麼n < 320
,我們可以把區間
[l, r)
,看成一對括號,左括號在
l,右括號在
r,那麼對於乙個位置
i,它最終的值就是它左邊的左括號數量減去右括號數量的,所以我們設
dp[i][l][r]
表示,當前位置是
i,左邊有
l個左括號,左邊有
r個右括號的方案數,
f[i][l][r]
表示,當前位置是
i,左邊有
l個左括號,左邊有
r個右括號的貢獻和,每一次
f[i][l][r] += dp[i][l][r] * (l - r)k
,轉移f,dp
轉移只需要直接列舉在
i + 1
的位置上放置左括號,右括號,左括號和右括號,或者不放置就可以了。具體轉移存在一些特判,具體見**。
source:
/*
created by scarlyw
*/#include #include #include #include #include #include #include #include #include #include #include #include inline char read()
return *s++;}/*
templateinline void r(t &x)
for (x = 0; isdigit(c); c = read())
x = ((x << 2) + x << 1) + (c ^ '0');
if (iosig) x = -x;
}//*/
const int out_len = 1024 * 1024;
char obuf[out_len], *oh = obuf;
inline void write_char(char c)
templateinline void w(t x)
}inline void flush()
///*
templateinline void r(t &x)
//*/
const int maxn = 350 + 10;
const int mod = 998244353;
int ans, n, m, k;
int f[2][maxn][maxn], dp[2][maxn][maxn], num[maxn];
inline int mod_pow(int a, int b)
inline void add(int &x, int t)
inline void solve()
if (r)
if (l && r)
add(f[x][l][r], (long long)dp[x][l][r] * num[l - r] % mod);
}} std::cout << f[m & 1][n][n];
}int main()
WC模擬(1 8) T3 送你一朵聖誕樹
送你一朵聖誕樹 題目背景 1.8 wc 模擬t3 分析 並查集 堆 貪心 對於全域性最小的那個點,選擇了它的父親之後,就一定會選擇它,所以我們直接合併它和它的父親,那麼對於乙個點集 i,記錄 ti為點集中的點的個數,si為點集中的點的權值和,那麼,對於兩個點集,如果點集 i優於點集 j,那麼 ti ...
YCH的模擬賽 T3
暴搜或者字典樹,但是因為輸出所有的方案而不是方案數,不管什麼做法都逃不過輸出,所以都差不多 sol1 記憶化搜尋 當列舉方案時,f i 表示已經把字串的前i個字母都拼好的情況下有多少方案 考慮從第i 1個字元開始到j是乙個給定的單詞 如果有這樣的j的話就可以轉移 然後開乙個vector把每乙個狀態下...
常州模擬賽d2t3 小X的佛光
平日裡最喜歡做的事就是蒸發學水。題目描述 小 x 所在的城市 x 城是乙個含有 n 個節點的無向圖,同時,由於 x 國是一 個發展中國家,為了節約城市建設的經費,x 國首相在建造 x 城時只建造 n 1 條邊,使得城市的各個地點能夠相互到達。小 x 計畫蒸發 q 天的學水,每一天會有一名學水從 a ...