題意:給定乙個正整數n,和乙個1-n的乙個排列,每個數可以和旁邊的兩個數的任意乙個交換,每交換一次總次數就要加一,問將這個排列轉換成乙個遞增的排列需要多少次交換?
題意可以轉換成求這個排列的逆序對數。
#include#includeview code#include
#include
using
namespace
std;
const
int m=1e3+3
;int
bit[m],n;
void update(int x,int
c)int sum(int
x)int
main()
printf(
"%d\n
",ans);
}return0;
}
題意:給定一串行,問排成公升序所要求的最少代價,序列中倆倆可相交換,代價為倆者的和
分析:對於每個數字x,我們只需要把它和前面比它大的數字交換,求出交換代價,重複執行就能得出答案。
這個代價就是,比它大的數字個數t*x+前面比它大的數字和。
#include#includeview code#include
#include
using
namespace
std;
typedef
long
long
ll;const
int m=1e5+5
;ll cnt[m],sum[m],n;
void update(int x,int c1,int
c2)}
ll cntt(
intx)
ll summ(
intx)
intmain()
printf(
"%i64d\n
",ans);
}return0;
}
HDU2689 Sort it(樹狀陣列求逆序數)
傳送門 如下 include include include define maxn 10000 using namespace std int n,tree maxn int lowbit int i int update int i,int x return 0 int query int n ...
hdu 3887 樹狀陣列
給你一棵樹,每個節點都有個編號。讓你求乙個節點他的子樹中編號比他小的節點有幾個。編號唯一,從1 n,已給出根節點 解 樹狀陣列統計。轉化為線性序列。可以想到的是,若要統計乙個節點,那麼比它小的孩子必須先插完,然後統計就行了。對於乙個節點i來說,只要把所有x那麼對於所有節點來說也是這樣的,從一開始插,...
hdu 3333 樹狀陣列
此題與3743相仿,但本題資料較大,需要用到離散化。如何去掉重複元素呢?採用離線演算法 首先將詢問按右端點從小到大排序,離線處理時,記錄每個元素所在位置,遇到重複元素時,從它之前出現的位置減去這個元素,這樣就是的每個元素總是出現在最後。include include include include ...