題目大意:給你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 為乙個串...