思路:將查詢區間按右節點的公升序排列,然後插入第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,設我們當前...