BZOJ3787 Gty的文藝妹子序列

2021-09-06 20:00:27 字數 1169 閱讀 8879

將序列分成$\sqrt$塊,預處理出每兩塊之間的逆序對數,以及ap[i]表示前i塊內數字出現次數的樹狀陣列

預處理:$o(n\sqrt\log n)$

修改時,ap[i]可以在$o(\sqrt\log n)$複雜度內完成修改,然後考慮修改的位置對答案的貢獻,可以發現相當於某一行、某一列都加上乙個數,對於行列各開$\sqrt$棵樹狀陣列差分維護

修改:$o(\sqrt\log n)$

查詢時中間那塊可以通過樹狀陣列$o(\log n)$求出,然後向兩邊暴力擴充套件

查詢:$o(\sqrt\log n)$

#includeconst int n=50010,k=230;

int n,m,op,l,r,i,j,k,size,block,a[n],pos[n],st[k],en[k],ans[k][k],t,x,y,z,now,all,last,tmp[k][2],ap[k][n],tag[2][k][k],bit[n],vis[n];

inline void read(int&a)

inline void add(int x)

inline int sum(int x)

inline void add(int p,int x,int y)

inline int sum(int p,int x)

inline void add(int w,int p,int x,int y)

inline int sum(int w,int p,int x)

inline void change(int x,int y)

for(i=en[k];i>x;i--)

now=ans[x+1][y-1]+sum(0,x+1,y-1)+sum(1,y-1,x+1),all=st[y]-en[x]-1;

for(i=st[y];i<=r;i++)now+=all-sum(a[i])-sum(y-1,a[i])+sum(x,a[i]),add(a[i]),all++;

for(i=en[x];i>=l;i--)now+=sum(a[i]-1)+sum(y-1,a[i]-1)-sum(x,a[i]-1),add(a[i]);

return now;

}int main()

read(m);

while(m--)

return 0;

}

bzoj3787 Gty的文藝妹子序列

我們回憶bzoj3289的做法,可以使用莫隊演算法,加上線段樹進行茲瓷in,out,query。我們回憶經典分塊做法。預處理ans i,j 表示第i塊到第j塊的答案,sum i,j 表示前i塊元素j的個數,然後只需要再弄個樹狀陣列就可以搞了。現在我們要茲瓷修改,那我們照著原來的思路改一下。ans i...

bzoj3720 Gty的妹子樹

我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫 然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。include include include include define fo i,a,b for i a i b i using namespace std const i...

bzoj3744 Gty的妹子序列

time limit 20 sec memory limit 128 mb submit 967 solved 293 submit status discuss 我早已習慣你不在身邊,人間四月天 寂寞斷了弦。回望身後藍天,跟再見說再見 某天,蒟蒻autumn發現了從 gty的妹子樹 bzoj372...