動態逆序對

2021-08-22 06:07:09 字數 1446 閱讀 6486

容易寫掛(對於新手與蒟蒻)

洛谷;cdq

如果按照三維偏序那樣求,那麼會漏掉一些情況。所以要跑兩遍cdq。

兩遍cdq又會有乙個問題,就是判等於的問題。第一遍cdq第三維判等於,第二遍判不等於.

#include

#define ll long long

using

namespace

std;

inline

int lowbit(int k)

namespace zjy_io

template

inline

void read(t&data)

data*=caa;

}inline

char getchar()

inline

void write(ll x)

}using

namespace zjy_io;

const

int _ = 1.03e5;

int n,m,cnt;

struct nodes[_],q[_];

int num[_];//aibj,cill ans[_];

ll tree[_];

struct errr[_];

inline

void modify(register

int loc,register

int zh)

inline

int query(register

int loc)

bool cmp(node x,node y);

modify(s[pin1].c,1);--ppl,--pin1;

}ans[s[pin2].c]+=query(s[pin2].c+1);

//cout}

while(pin1>=l)

for(register

int i=l;i<=r;++i)s[i]=q[i];

for(register

int i=1;i<=cnt;++i)modify(rr[i].a,-rr[i].b);cnt=0;

}void cdq(register

int l,register

int r);

modify(s[pin2].c,1),++ppl,++pin2;

}ans[s[pin1].c]+=query(s[pin1].c),q[ppl]=s[pin1],ppl++;

}while(pin2<=r)q[ppl]=s[pin2],++ppl,++pin2;

for(register

int i=l;i<=r;++i)s[i]=q[i];

for(register

int i=1;i<=cnt;++i)modify(rr[i].a,-rr[i].b);cnt=0;

}int main()

動態逆序對

題目鏈結 對於序列a,它的逆序對數定義為滿足iaj的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪 除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數 input 輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。以下n行每行包含乙個1到n之間的正整數,即...

動態逆序對 CDQ

cdq二層試煉 bzoj3295 題意大致是 給你乙個序列 乙個1 n的排列 每次刪掉乙個數,求刪掉之前的逆序對。方案1 強行模擬,每次刪掉乙個乙個數,在剩下的數裡面用歸併求逆序對,複雜度o mnlogn 這個複雜度明顯是不能接受的 方案2 樹套樹,量令人傷心。方案3 cdq分治。之前已經寫過一篇 ...

動態逆序對 CDQ分治

對於序列a,它的逆序對數定義為滿足iaj的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。輸入格式 輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。以下n行每行包含乙個1到n之間的正整數,即初始排列。以下...