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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj6342-[NOIP2019模拟2019.9.7]Tiny Counting【树状数组,容斥】

發(fā)布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jzoj6342-[NOIP2019模拟2019.9.7]Tiny Counting【树状数组,容斥】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題


題目大意

一個序列SSS,求有多少個互不相同的4元組(a,b,c,d)(a,b,c,d)(a,b,c,d)使得a&lt;b且Sa&lt;Sba&lt;b且S_a&lt;S_ba<bSa?<Sb?
c&lt;b且Sc&gt;Sdc&lt;b且S_c&gt;S_dc<bSc?>Sd?


解題思路

若可以重復(fù)其實答案就是逆序?qū)€數(shù)乘上正序?qū)€數(shù)。

然后我們考慮將重復(fù)的去掉
這里定義up1,down1up_1,down_1up1?,down1?為左邊大于/小于該數(shù)的個數(shù),up2,down2up2,down2up2,down2為右邊大于/小于該數(shù)的個數(shù)。
a=ca=ca=c,那么有Sd&lt;Sa=c&lt;SbS_d&lt;S_{a=c}&lt;S_bSd?<Sa=c?<Sb?,且(a=c)&lt;b,d(a=c)&lt; b,d(a=c)<b,d,為up2?down2up2*down2up2?down2
a=da=da=d,那么有Sc&gt;Sa=d&lt;SbS_c&gt;S_{a=d}&lt;S_bSc?>Sa=d?<Sb?,且c&lt;(a=d)&lt;bc&lt;(a=d)&lt;bc<(a=d)<b,為up1?up2up1*up2up1?up2
b=cb=cb=c,那么有Sa&lt;Sb=c&gt;SdS_a&lt;S_{b=c}&gt;S_dSa?<Sb=c?>Sd?,且a&lt;(b=d)&lt;da&lt;(b=d)&lt;da<(b=d)<d,為down1?down2down1*down2down1?down2
b=db=db=d,那么有Sa&lt;Sb=d&lt;ScS_a&lt;S_{b=d}&lt;S_cSa?<Sb=d?<Sc?,且a,c&lt;(b=d)a,c&lt;(b=d)a,c<(b=d),為up1?down1up1*down1up1?down1


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define lowbit(x) (x&-x) #define ll long long using namespace std; const ll N=1e5+100; ll n,a[N],c[N],s1,s2,z,m; struct Tree_array{ll t[N];void Clear(){memset(t,0,sizeof(t));}void Change(ll x,ll z){while(x<=m){t[x]+=z;x+=lowbit(x);}}ll Ask(ll x){ll ans=0;while(x){ans+=t[x];x-=lowbit(x);} return ans;} }T1,T2; int main() {freopen("a.in","r",stdin);freopen("a.out","w",stdout);scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),c[i]=a[i];sort(c+1,c+1+n);m=unique(c+1,c+1+n)-c-1;for(ll i=1;i<=n;i++){a[i]=lower_bound(c+1,c+1+m,a[i])-c;T2.Change(a[i],1);}for(ll i=1;i<=n;i++){ll down1=T1.Ask(a[i]-1),up1=T1.Ask(m)-T1.Ask(a[i]);ll down2=T2.Ask(a[i]-1),up2=T2.Ask(m)-T2.Ask(a[i]);s1+=down1;s2+=down2;z+=up2*down2+up1*up2+down1*down2+up1*down1;T1.Change(a[i],1);T2.Change(a[i],-1);}printf("%lld",s1*s2-z); }

總結(jié)

以上是生活随笔為你收集整理的jzoj6342-[NOIP2019模拟2019.9.7]Tiny Counting【树状数组,容斥】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。