題意:給定乙個排列和陣列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...