SPOJ 227 樹狀陣列

2021-06-18 15:22:39 字數 603 閱讀 4651

題意:給定乙個排列和陣列b[i]表示i前面比a[i]小的點的個數,

求a[i](n的乙個排列)

solution:維護乙個c陣列,表示c=。從右向左對每個b[i],

找到最小的j 使c[j]=b[i].則a[i]=j;

如何維護c->樹狀陣列

如何查詢j->二分

#include#include#include#includeusing namespace std;

#define n 200005

int n;

int a[n];

struct bit

int lowbit(int x)

void update(int x,int y)

else l=mid+1;

}return ans;

}void doit()

for (int i=n;i>=1;i--)

printf("%d",a[1]);

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

printf(" %d",a[i]);

printf("\n");}

int main()

SPOJ 3267 DQUERY(離線 樹狀陣列)

傳送門 話說這好像hh的項鍊啊 然後就說一說上次看到的一位大佬很厲害的辦法吧 對於所有 r 相等的詢問,需要統計有多少個不同的數,那麼對於同乙個數字,我們只需要關心它最右邊的那乙個 比如 1,2,3,4,1,2 對於所有 r 5 的詢問,我們不用去管第乙個 1 因為它一定可以被第五個 1 代替 同理...

spoj 694 705 字尾陣列

每個子串一定是某個字尾的字首,那麼原問題等價於求所有字尾之間的不相同的字首的個數。如果所有的字尾按照 suffix sa 1 suffix sa 2 suffix sa 3 suffix sa n 的順序計算,不難發現,對於每一次新加進來的字尾 suffix sa k 它將產生 n sa k 1 個...

SPOJ 220 字尾陣列

簡略題意 每個字串中至少出現兩次,且不重疊的最長子串先將n 個字串連線起來,二分答案t,用 t 分組之後看同一組的是否出現在所有串中至少兩次,且在每個原串中的最大最小sa i sa j k。其實只要同時存在最大最小位置,即出現了至少兩次。include include include include...