日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj3295

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj3295 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

cdq分治

我們把每個數都視作插入和詢問,那么每個詢問就是當前的貢獻。。。

事實上這道題可以看做一個三維偏序:(t,v,pos) 插入時間,值,插入位置

兩個數當且僅當形成逆序對時是x,y,x的插入時間比y早,x的值比y小,x在y的后面,x的值比y大,x在y的前面。

那么就可以cdq分治了

#include<bits/stdc++.h> using namespace std; typedef long long ll; #define N 400010 #define lowbit(i) i&-i struct query {int v,id,pos,type; }q[N]; int n,tot,m; ll a[N],b[N],tree[N],ans[N],pos[N]; bool flag[N]; vector<query> c; inline void update(int pos,int delta) {for(int i=pos;i<=n;i+=lowbit(i)) tree[i]+=delta; } inline ll sum(int pos) {ll ret=0; for(int i=pos;i;i-=lowbit(i)) ret+=tree[i]; return ret;} inline bool cp1(query x,query y) {if(x.pos!=y.pos) return x.pos<y.pos; return x.type<y.type;} inline bool cp2(query x,query y) {if(x.pos!=y.pos) return x.pos>y.pos; return x.type<y.type;} void cdq(int l,int r) { if(l>=r) return;int mid=(l+r)>>1;cdq(l,mid); cdq(mid+1,r);c.clear();for(int i=l;i<=mid;++i) if(q[i].type==1) c.push_back(q[i]);for(int i=mid+1;i<=r;++i) if(q[i].type==2) c.push_back(q[i]);sort(c.begin(),c.end(),cp1);for(int i=0;i<c.size();++i){if(c[i].type==1) update(c[i].v,1);if(c[i].type==2) ans[c[i].id]+=sum(n)-sum(c[i].v);}for(int i=0;i<c.size();++i) if(c[i].type==1) update(c[i].v,-1);sort(c.begin(),c.end(),cp2);for(int i=0;i<c.size();++i){if(c[i].type==1) update(c[i].v,1);if(c[i].type==2) ans[c[i].id]+=sum(c[i].v-1);}for(int i=0;i<c.size();++i) if(c[i].type==1) update(c[i].v,-1); } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&a[i]);pos[a[i]]=i;}for(int i=1;i<=m;++i){scanf("%d",&b[i]);flag[b[i]]=1;}int t=0;for(int i=1;i<=n;++i) if(!flag[a[i]]){q[++tot].v=a[i];q[tot].type=1;q[tot].pos=pos[a[i]];q[++tot].v=a[i];q[tot].type=2;q[tot].pos=pos[a[i]];q[tot].id=++t;}for(int i=m;i;--i){q[++tot].v=b[i];q[tot].pos=pos[b[i]];q[tot].type=1;q[++tot].v=b[i];q[tot].pos=pos[b[i]];q[tot].type=2;q[tot].id=++t;}cdq(1,tot);for(int i=1;i<=n;++i) ans[i]+=ans[i-1];for(int i=n;i>=n-m+1;--i) printf("%lld\n",ans[i]); // fclose(stdin); // fclose(stdout);return 0; } View Code

?

轉載于:https://www.cnblogs.com/19992147orz/p/6387014.html

總結

以上是生活随笔為你收集整理的bzoj3295的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。