題目:
題意:給定乙個長度為n的陣列,陣列中元素為1到n,詢問某個區間內有多少段連續的數字
思路:之前用莫隊演算法寫的,很簡單,今天用樹狀陣列離線搞得,感覺不如莫隊好想,但是效率高了將近一倍。把詢問按照右端點從小到大排序,對於每個數,我們看成是孤立的,更新到樹狀陣列上,即把這個位置加1,然後判斷這個數的左右相鄰數字是否已經更新到樹狀陣列中,若已更新則去掉,那麼求某個區間內連續數字的段數變轉換為求區間和
#include #include #include #include #include using namespace std;
typedef long long ll;
const int n = 100010;
int bit[n], res[n];
int a[n], b[n], pos[n];
bool vis[n];
int n, m;
struct node
g[n];
void add(int i, int x)
int sum(int i)
bool cmp(node a, node b)
int main()
for(int i = 1; i <= m; i++) printf("%d\n", res[i]);
}return 0;
}
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,設我們當前...
HDU 4638 Group 樹狀陣列
詢問一段區間裡的數能組成多少段連續的數。先考慮從左往右乙個數乙個數新增,考慮當前新增了i 1個數的答案是x,那麼可以看出新增完i個數後的答案是根據a i 1和a i 1是否已經新增而定的 如果a i 1或者a i 1已經新增乙個,則段數不變,如果都沒新增則段數加1,如果都新增了則段數減1。設v i ...