思路:可以先求開始序列的逆序數,一開始記錄每個葉子節點的值為0,然後對於每個數,插入之後更新一下,對於當前的x[i],需要插敘[x[i], n - 1]之間的數已經出現了多少個。求出一開始的逆序數之後,就可以通過遞推關係式以此找出後面的逆序數對。
/*****************************************
author :crazy_ac(jamesqi)
time :2015
file name :
*****************************************/
// #pragma comment(linker, "/stack:1024000000,1024000000")
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define mem(a,b) memset(a,b,sizeof a)
typedef long long ll;
typedef unsigned long long ull;
typedef pairii;
const int inf = 1 << 30;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
inline int readint()
return x;
}const int maxn = 5010;
int sum[maxn << 2];
void pushup(int rt)
void build(int l,int r,int rt)
void updata(int l,int r,int rt,int p)
int mid = (l + r) >> 1;
if (p <= mid) updata(l,mid,rt << 1,p);
else updata(mid + 1,r,rt << 1 | 1,p);
pushup(rt);
return;
}int query(int l,int r,int rt,int l,int r)
int mid = (l + r) >> 1;
int res = 0;
if (l <= mid) res += query(l,mid,rt << 1,l,r);
if (r > mid) res += query(mid + 1,r,rt << 1 | 1,l,r);
return res;
}int n,num[maxn];
int main()
int ans = sum;
for (int i = 0;i < n;i++)
printf("%d\n",ans);
} return 0;
}
序數序列hdu 1394
首先宣告,我是乙個菜鳥。一下文章中出現技術誤導情況蓋不負責 分析 a 0 的逆序數為0,a 0 後邊有a 0 個比a 0 小的數,將a 0 移到末尾是,a 0 的逆序數釀成n 1 a 0 而a 0 個比a 0 小的數的逆序數都減1,設原序列的逆序數為sum,則新序列的逆序數sum sum a 0 n...
HDU 1394 最小逆序數
include using namespace std define lson l,m rt 1 define rson m 1,r,rt 1 1 const int maxn 5555 int sum maxn 2 void pushup int rt void build int l,int r...
hdu 1394 求逆序數
首先建立空樹,將 a i 逐個插入 計算乙個序列n排列的最小逆序數 首先用線段樹算出出事序列的逆序數,然後找規律推出排列的最小逆序數。include include include include include include include include include include inc...