P1091 合唱隊形(樹狀陣列)

2021-08-22 06:02:33 字數 971 閱讀 8752

這裡是題幹:

好吧,這道題其實用動態規劃就好了,但是無聊的老師居然還讓我用樹狀陣列的方法再做一遍,又過去了乙個上午。

先說思路:這道題可以拆分為乙個上公升子串行和乙個下降子串行的組合,再列舉中間最高的人的位置,將以他結尾的最大上公升序列和以他開頭的最大下降序列相加,再求乙個最大值就好了。

那麼,問題來了——

我們在**可以用到樹狀陣列呢?

在輸入的時候我們用乙個f陣列來儲存在這個數輸進來之前有多少個數比他小,其中去乙個最大值,再加上一作為這個數的f陣列的值。

我們再用乙個s[x]表示從f[x]到f[x-lowbit(x)+1]這些之裡面的最大值。

在更改完乙個f陣列的值之後,s陣列也要跟著改變,需要改變的陣列和其他的樹狀陣列一樣,就不詳細列出來了,直接看**就好了。之後,f[x]的值也要更新一下,f[x]=s[x]+s[x-lowbit(x)]-……,這個過程也是相似的。

這個是求以x結尾的最長上公升子串行,那麼求以x開頭的最長下降子串行也是大同小異,只不過是從後往前做了。。。

最後附上**:

#include

#include

using

namespace

std;

int n,a[110][2],s[110],f[110][2];

inline

int lowbit(int x)

int findmax(int x)

return ans;

}void update(int x,int value)

}int main()

for(int j=0;j<=1;++j)

}int ans=0;

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

ans=max(ans,f[i][0]+f[n+1-i][1]-1);

cout

0;}

說實話,這些東西都不靠死記硬背,理解才是硬道理。。。

P1091 合唱隊形

n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 ti 1 tk 1 i k 你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,...

P1091 合唱隊形

nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足t1 ti 1 t...

P1091 合唱隊形

題目描述 nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足 t1 ...