hdu1394(單點更新)

2021-07-05 12:56:13 字數 1568 閱讀 8767

思路:可以先求開始序列的逆序數,一開始記錄每個葉子節點的值為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...