傳送門
很神的dpdp
dp題。首先要確定乙個dpdp
dp的順序保證答案的正確性。
對於兩個元素,分四種情況討論它們的關係:
如果a i⩽
bjan
db
i a_i \leqslant b_j\ and\ b_i < a_j ai⩽bj and bi,那麼i ii必須排在j jj的前面。 如果a i>bj andb i⩾aj a_i > b_j\ and\ b_i \geqslant a_j ai>bj and bi⩾ aj,那麼j jj必須排在i ii的前面。 如果a i>bj andb i a_i > b_j\ and\ b_i < a_j ai>bj and bi,那麼i ii和j jj相互不能更新。 如果a i⩽ bjan dbi⩾ aj a_i \leqslant b_j\ and\ b_i \geqslant a_j ai⩽bj and bi⩾ aj,那麼i ii和j jj相互可以更新。 對於後兩種情況,i ii和j jj的排列順序是無所謂的,只需要保證前面兩種的順序是對的。 然而前面的兩個比較關係並不滿足嚴格弱序,sor tsort sort 會出問題。 考慮如何把這個大小關係轉化: a_i \leqslant b_j \\ b_i < a_j \end \longrightarrow a_i+b_i +c [i ]a[i]]\}+c[i] a[i]]} +c[i ](選第i ii個) f [i ][j] =max (f[i ][j] ,f[i −1][ j]+c [i]) ,j∈( a[i] ,b[i ]] f[i][j]=max(f[i][j],f[i-1][j]+c[i]),j\in(a[i],b[i]] f[i][j ]=ma x(f[ i][j ],f[ i−1] [j]+ c[i] ),j∈ (a[i ],b[ i]](選第i ii個) 首先,i ii這一維可以壓掉。 不選a [i ]a[i] a[i] 相當於是直接繼承過來。 第二個操作是區間查詢最大值,單點修改。(要比較,取max maxma x)第三個操作是區間加,肯定比之前的大。所以其實並不用取max maxma x。於是就可以用線段樹維護辣!!! 由於a aa的範圍很大,所以離散化一下就行了。 注意單點改是取max maxma x!因為有b i b_ibi 的情況! #define ll long long #define re register #define cs const cs int n= 1e5+10; namespace io template < typename t> inline t get() inline intgi() inline ll gl() }using io::gi; using io::gl; int n,st[n<<1] ,top= 0,m; struct elements }p[n] ;inline void disc() #define lc (root<<1) #define rc (root<<1|1) #define mid (t[root].l+t[root].r>>1) inline ll max (ll x,ll y) inline void max(ll &x,ll y) inline intmin (int x, int y) struct nodet[n<<3] ;inline void pushup (int root) inline void pushnow (int root,ll val) inline void pushdown (int root) }inline void build (int root, int l, int r) build (lc,l,mid) ,build (rc,mid+ 1,r) ,pushup (root);} inline void update (int root, int pos,ll val) pushdown (root) ;(pos<=mid) ?update (lc,pos,val) :update (rc,pos,val) ;pushup (root);} inline void range_add (int root, int l, int r,ll val) inline ll querymax (int root, int l, int r) intmain() printf ("%lld\n" ,t[1 ].mx) ;} 數列 sequence.pas c cpp 問題描述 雖然msh長大了,但她還是很喜歡找點遊戲自娛自樂。有一天,她在紙上寫了一串數字 1,1,2,5,4。接著她擦掉了乙個1,結果發現剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些數後,剩下的數列中在自己位置上... 小a有n個球,編號分別為1到n,小a每次都會從n個球中取出若干個球,至少取乙個,至多取n個,每次取完再放回去,需要滿足以下兩個條件。1 每次取出的球的個數兩兩不同。2 每次取出的球的集合兩兩不包含。包含是指,對於兩次取球,對於取的數目少的那次取球的所有球都出現在取的數目多的那次取球中,例如 1,2 ... 小a有n個球,編號分別為1到n,小a每次都會從n個球中取出若干個球,至少取乙個,至多取n個,每次取完再放回去,需要滿足以下兩個條件。1 每次取出的球的個數兩兩不同。2 每次取出的球的集合兩兩不包含。包含是指,對於兩次取球,對於取的數目少的那次取球的所有球都出現在取的數目多的那次取球中,例如 1,2 ...#include
NOIp模擬 數列
NOIP模擬 數球(思維題)
NOIP模擬 數球(思維題)