目錄模板
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的函式。這樣,如果直...