Hdu 4638 Group 離線 樹狀陣列

2021-06-25 21:28:00 字數 650 閱讀 8627

題目大意:給你1-n的任意全排列,詢問q次,每次詢問區間[l-r]內的組數,組數的定義為:在乙個連續區間中,可以把區間中的數任意分成幾組,每組的所有數必須連續,比如

7 5 8的組數為2,即7,8和5。

解題思路:先假設每個數都是一組,然後查詢和他相鄰的兩個數是否在此之前出現過,如果出現則 出現的位置標記減1,最後就是區間求和問題。

**如下:

#include#include#includeusing namespace std;

#define m 100005

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

int t,n,m;

int s[m],pos[m],a[m],ans[m];

struct node

p[m];

bool cmp(node a,node b)

return sum;

}int main()

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

sort(p+1,p+1+m,cmp);

memset(s,0,sizeof(s));

int j=1;

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

{insert(i,1);

if(a[i]>1&&pos[a[i]-1]

HDU 4638 Group 樹狀陣列離線

題目 題意 給定乙個長度為n的陣列,陣列中元素為1到n,詢問某個區間內有多少段連續的數字 思路 之前用莫隊演算法寫的,很簡單,今天用樹狀陣列離線搞得,感覺不如莫隊好想,但是效率高了將近一倍。把詢問按照右端點從小到大排序,對於每個數,我們看成是孤立的,更新到樹狀陣列上,即把這個位置加1,然後判斷這個數...

hdu 4638 Group 單點修改和離線線段樹

跟hdu4630如出一轍,但是思想上還是要有特別技巧 對於 l,r 上的數a i 我們給乙個標記mark i 表示第第i個數屬於某個連續區間 初始時都賦值為0 pos a i 表示值為a i 的數所在位置 當遇到情況 a i 1 或 a i 1 曾經 出現過時,mark pos a i 1 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 為乙個串...