NOIP模擬 2017 10 4 總結

2021-08-08 23:48:26 字數 2380 閱讀 8375

emmmmmm,每次好不容易想出來解法,實現上卻總是各種疏忽,該拿的分拿不滿,很氣。

這個題好像是沒有什麼針對的資料結構的,但是其實可以用乙個線段樹就把這個題水了,因為字母一共只有26種,我們可以直接查詢每種數字的個數,然後一段一段的區間修改。如果是公升序,從a到z依次賦值,降序就從z到a,常數比較大但是可以加一些比如讀優和register一樣的玄學優化

可以卡過就對了嘛=w=

這題的模型還是第一次見到,這題很明顯是個dp。

關鍵在於這個dp的狀態和轉移,定義dp[i][j]為當前已經列舉到第i列,有j個右線段的左端點在i的左邊,並且還未處理。注意,凡是我們i所到之處,右端點在i左邊的左線段都必須被處理完。每次由i-1轉移到i時,將右端點在該列的左線段全部處理了(相當於我們是需要把這些線段全部填充乙個1,那麼我們可以選擇在之前的」空列&&當前列」選擇一些列來使用,並且由於它們所在的行不一樣,因此是排列而不是組合),並且判斷左端點在i位置的右線段是否填充(如果我們把當前列用於右線段填充,那麼對於左線段來說,他的可選空列就不包含當前列,但是同時由於左端點在當前位置的右線段可能有很多個,但是一列只能填充乙個線段,因此還需要在排列數基礎上*左端點在i位置的右線段數量),然後使用排列數和乘法原理轉移。

#include 

#include

#include

using namespace std ;

const int mmod = 998244353 ;

int n , m , cl[3005] , cr[3005] , sl[3005] , sr[3005] , s[3005] ;

int c[3001][3001] , fac[3001] = , dp[3001][3001] ;

int main()

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

fac[i] = 1ll * fac[i-1] * i %mmod ;

for( int i = 1 , li , ri ; i <= n ; i ++ )

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

dp[0][0] = 1 ;

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

printf( "%d" , dp[m][0] ) ;

}

noip模擬總結

先講講今天的比賽,t1 看著很水,在草稿紙上畫了一下,發現其實並不簡單,於是先去打第二題,最後半個小時實在是一點頭緒也沒有,打了個狀壓dp 70分 暴力分真多 t2 把樣例畫出來模擬一下就想到了,套路題,就是暴力有點難打,自信不對拍 還好沒掛 t3 又是乙個套路題,可惡的博弈,坑了我半天,最後還是想...

noip模擬總結

先講講今天的比賽,t1 看著很水,在草稿紙上畫了一下,發現其實並不簡單,於是先去打第二題,最後半個小時實在是一點頭緒也沒有,打了個狀壓dp 70分 暴力分真多 t2 把樣例畫出來模擬一下就想到了,套路題,就是暴力有點難打,自信不對拍 還好沒掛 t3 又是乙個套路題,可惡的博弈,坑了我半天,最後還是想...

NOIP模擬8 12總結

不想吐槽今天的題面 非常吃力地看完題後,還是先做t1。t1發現 n 很大而 m很小,就想肯定要從 m 下手,很快相處了正確的做法,dp很快打完,然而一開始打的組合數是不允許有0存在的,然後調了幾次才發現問題所在,因為時間只有三個半鐘,此時差不多過了乙個鐘了 這是有點心慌,忘了這最基本的擋板問題,還花...