0x42 樹狀陣列

2021-08-28 10:13:04 字數 3267 閱讀 2800

目錄模板

poj2299

題目鏈結 題目

題解 **

ch4201 多種逆序對求法

題目鏈結 題目

題解 **

poj3468

題目鏈結 題目

題解 **

inline int lowbit(int x) 

void add(int x,int y)

}int ask(int x)

return res;

}

求有多少逆序對。 舉例:1,2,3有3對逆序對,而3,2,1沒有逆序對

由於排序規則定義是由大到小,所以在將a[i]加入樹狀陣列前,先求1-a[i-1]的和,這就是與第i個元素構成的逆序對的個數。

由於資料規模很大,需要先離散化一下。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define init(x) memset(x,0,sizeof(x))

#define eps 1e-8

#define next next_

typedef long long ll;

typedef unsigned long long ull;

const int inf = 0x7fffffff;

const int inf = 0x3f3f3f3f;

const int maxn = 1000005;

const int n = 105;

inline void read(ll &x)

while(s>='0'&&s<='9')

x*=f;

}ll n,a[maxn],c[maxn*4],ans,f[maxn],temp[maxn];

inline ll lowbit(int x)

void add(ll x,ll y)

}ll ask(ll x)

return res;

}void discrete()

cout

如果三個數滿足x1y2如果三個數滿足x1y3, 那麼稱為「^」字型;

給定n個數,求「v」字型和「^"字型各有多少對。

以v字形為例,如果遍歷到了a[i],那麼記錄i前面比它大的數有left[i]個,它後面比它大的數有right[i]個,那麼這乙個數能形成的v字形的對數就是 left[i]*right[i] 個,其他同理。

這裡面涉及到很多種逆序對的求法。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define init(x) memset(x,0,sizeof(x))

#define eps 1e-8

#define next next_

typedef long long ll;

typedef unsigned long long ull;

const int inf = 0x7fffffff;

const int inf = 0x3f3f3f3f;

const int maxn = 200005;

const int n = 105;

inline void read(int &x)

while(s>='0'&&s<='9')

x*=f;

}int n,a[maxn];

ll ans1[maxn],ans2[maxn],c[maxn],ans,tot;

inline int lowbit(int x)

void add(int x,int y)

}ll query(ll x)

return res;

} int main()

for(int i=0;i

首先輸入n個數,然後有q個操作;

第一類指令形如"c l r d", 表示把數列中第 l~r 個數都加上d;

第二類指令形如」q l r", 表示詢問數列中第 l~r個 數的和。

對於區間修改來說,l~r都加上d,那麼可以 b[l] += d, b[r+1] -= d,用差分的形式來維護;

這樣如果直接對某乙個點i求和,那麼求出來的並不是a[1]~a[i]的字首和,而就是a[i]的值;

變成這種形式,第乙個字首和就用正常的樹狀陣列來維護,第二個另開乙個樹狀陣列來維護 i*b[i] 的字首和。

考慮到剛開始有初始值,這一部分可以先對a陣列預處理,它們初始值的和就是sum[r]-sum[l-1]。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define init(x) memset(x,0,sizeof(x))

#define eps 1e-8

#define next next_

typedef long long ll;

typedef unsigned long long ull;

const int inf = 0x7fffffff;

const int inf = 0x3f3f3f3f;

const int maxn = 200005;

const int n = 105;

inline void read(ll &x)

while(s>='0'&&s<='9')

x*=f;

}ll n,q,a[maxn],c[2][maxn],sum[maxn];

string s;

inline int lowbit(int x)

void add(int k,int x,int d)

}ll query(int k,int x)

return res;

}int main()

while(q--)

else

} return 0;

}

rand的產生的隨機數不大與0x7ff

最大32767 2 16 1 系統裡的隨機數是利用初等數論中的同餘定理來實現的.整數rand的原理是 y ax b mod n 其中,n一般是乙個很大的素數,幾萬。a也是大素數。而且a,b,n都是常數。所以rand的產生決定於x,他被稱為seed。每乙個seed都是上一次產生的y的函式。這樣,如果直...