BZOJ4919 Lydsy六月月賽 大根堆

2022-05-31 06:42:10 字數 1639 閱讀 4985

題解:

我覺得資料結構寫成結構體還是有必要的

因為不然一道題裡出現了兩個相同的資料結構由於名字很像很容易出錯

另外初始化用segmenttree()

首先裸的dp很好想

f[i][j]表示在i點,最大值<=j的點數最大值

看了別人的題解知道了可以用線段樹合併來優化這個東西。。

我們考慮對於每個點,首先我們要合併它的子樹

其實就是對於相同位置的點相加即可

然後考慮當前節點,我們應用f[v[x]-1]+1去更新v[x]-n之間的值(也就是取max操作)

不然是沒法down的

1.當x,y其中有乙個左二子沒有的時候

就需要給它加乙個sum標記

原因是,由於他沒有左二子了,說明它對應的左二子的lazy值都是這個

所以要變成sum標記,對每乙個子節點都加上這個

2.down的時候也要用lazy[fa]更新lazy[x] 原因是有sum[x]的存在

#include using

namespace

std;

const

int n=1e6;

const

int inf=1e9;

#define il inline

#define rint register int

intn,m,fa[n],vv[n],head[n],l;

struct

rea[n],v[n];

il int max(int x,int

y)il

int min(int x,int

y)void arr(int x,int

y)struct

segmenttree

il void down(int

x)

int merge(int x,int

y)

int query(int x,int h,int t,int

pos)

void change(int &x,int h,int t,int h1,int t1,int

k)

down(x);

if (h1<=mid) change(ls[x],h,mid,h1,t1,k);

if (mid1

,t,h1,t1,k);

}}se1;

void dfs(int x,int

fa) se1.change(se1.rt[x],

1,n,vv[x],n,se1.query(se1.rt[x],1,n,vv[x]-1)+1);}

bool

cmp(re x,re y)

intmain()

sort(v+1,v+n+1

,cmp);

v[0].a=inf;

int cnt=0;

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

dfs(

1,0);

int ans2=0;

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

ans2=max(ans2,se1.query(se1.rt[1],1

,n,i));

cout

}

bzoj4919 Lydsy1706月賽 大根堆

給定一棵n個節點的有根樹,編號依次為1到n,其中1號點為根節點。每個點有乙個權值v i。你需要將這棵樹轉化成乙個大根堆。確切地說,你需要選擇盡可能多的節點,滿足大根堆的性質 對於任意兩個點i,j,如果i在樹上是j的祖先,那麼v i v j。請計算可選的最多的點數,注意這些點不必形成這棵樹的乙個連通子...

英語總結 六月

在提高班學習了很多英語 兒童詞典 牛津詞典 羅塞塔 english class 從零開始學英語等等。但是對於我來說其實只有兒童詞典 english class 從零開始學英語是我有始有終的認真學下來的!除了這些之外的其他英語資料學習的效果和狀態都不是很好!大都是有認真的開始,卻沒有堅持下去的耐心和毅...

程式設計六月定律

上週,我被迫對乙個很老的專案做一些修改。麻煩是,當開始著手時,我真的記不清這個專案究竟有多老了。這實際上是我使用codeigniter實現的第乙個mvc專案。開啟專案檔案後,很多東西都讓我頭暈。首先,沒有版本控制,第二,沒有注釋。id iframe 0.719018345291395 src dat...