容易寫掛(對於新手與蒟蒻)
洛谷;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之間的正整數,即初始排列。以下...