NOIp模擬 數對

2021-09-29 04:57:09 字數 3412 閱讀 1199

傳送門

很神的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

​​的情況!

#include

#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)

;}

NOIp模擬 數列

數列 sequence.pas c cpp 問題描述 雖然msh長大了,但她還是很喜歡找點遊戲自娛自樂。有一天,她在紙上寫了一串數字 1,1,2,5,4。接著她擦掉了乙個1,結果發現剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些數後,剩下的數列中在自己位置上...

NOIP模擬 數球(思維題)

小a有n個球,編號分別為1到n,小a每次都會從n個球中取出若干個球,至少取乙個,至多取n個,每次取完再放回去,需要滿足以下兩個條件。1 每次取出的球的個數兩兩不同。2 每次取出的球的集合兩兩不包含。包含是指,對於兩次取球,對於取的數目少的那次取球的所有球都出現在取的數目多的那次取球中,例如 1,2 ...

NOIP模擬 數球(思維題)

小a有n個球,編號分別為1到n,小a每次都會從n個球中取出若干個球,至少取乙個,至多取n個,每次取完再放回去,需要滿足以下兩個條件。1 每次取出的球的個數兩兩不同。2 每次取出的球的集合兩兩不包含。包含是指,對於兩次取球,對於取的數目少的那次取球的所有球都出現在取的數目多的那次取球中,例如 1,2 ...