hdu 4638 樹狀陣列

2022-05-22 07:06:11 字數 744 閱讀 2141

思路:將查詢區間按右節點的公升序排列,然後插入第i個數的時候,若nun[i]+1已經插入,那麼就update(pre[num[i]+1],-1);pre表示的是該數的位置。同樣若

num[i]-1存在就update(pre[num[i]-1],-1);因為他麼與num[i]屬於一組,故只需乙個存在就行。當查詢的右邊界r等於i時,只需對其左邊界求和就行,sum(qt[j].l)。

#include#include

#include

#include

#define maxn 100010

#define lowbit(x) (x&(-x))

using

namespace

std;

intc[maxn],pre[maxn],n,ans[maxn];

struct

qt}qt[maxn];

int sum(int

pos)

return

sum;

}void update(int pos,int

val)

}int

main()

sort(qt+1,qt+1+m);

j=1;

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

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

printf(

"%d\n

",ans[i]);

}return0;

}

多校第四場 Hdu 4638 樹狀陣列

題意 一段區間裡怎樣分組才能使得value最大,組內人員編號必須是連續的,剛一看這個題目我就確定是用樹狀陣列做,但是怎麼想也想不到樹狀陣列怎麼分組。無語了。我用筆推了一下,要是各組value值最大,必須盡量每一組的人數足夠大,組數盡量小,如4個人,分一組,value 4 4,這時值最大,兩組時3 1...

hdu4638 Group(樹狀陣列)

題目大意 給乙個1 n的排列,然後詢問 x,y 區間中有多少個連續的段。如給乙個3 1 2 5 4,查詢是2 4,那麼就是問1 2 5中有多少個連續的串,一共有兩個串,1 2為乙個串,5為乙個串 若查詢是2 5,則問的是1 2 5 4中有多少個連續的串,一共有兩個串,1 2為乙個串,4 5 為乙個串...

hdu 4638 Group 樹狀陣列

題意 找到區間裡有多少組連續數字串 分析 思路 顯然,我們要使得value最大,就要盡量將連續的id分在一組,所以問題轉化為求乙個區間中連續id區間的個數。我們從左往右掃瞄,依次考慮右端點為i的詢問,設dp l 為區間 l,i 的連續區間個數,po i 為i出現的位置,若還未出現,則為0,設我們當前...