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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

编程问答

YbtOJ#791-子集最值【三维偏序】

發(fā)布時(shí)間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YbtOJ#791-子集最值【三维偏序】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接:http://www.ybtoj.com.cn/contest/123/problem/1


題目大意

給出333個(gè)長(zhǎng)度為nnn的排列A,B,CA,B,CA,B,C。然后一個(gè)下標(biāo)集合SSS的三元組是
(max{Ai},max{Bi},max{Ci})(i∈S)(max\{A_i\},max\{B_i\},max\{C_i\})(i\in S)(max{Ai?},max{Bi?},max{Ci?})(iS)

求所有下標(biāo)集合不同的三元組數(shù)量
1≤n≤1051\leq n\leq 10^51n105


解題思路

所有下標(biāo)集合的三元組都能用一個(gè)∣S∣≤3|S|\leq 3S3的集合代替,所以我們只考慮∣S∣≤3|S|\leq 3S3的就好了。

∣S∣=1|S|=1S=1的個(gè)數(shù)就是nnn,直接累加即可。

∣S∣=2|S|=2S=2的話(huà),那就代表某個(gè)下標(biāo)霸占了兩個(gè)最大值,而另一個(gè)一定是另一個(gè)下標(biāo)的,如果是a,ba,ba,b最大,那么我們就要找滿(mǎn)足ai>aj,bi>aj,ci<cja_i> a_j,b_i> a_j,c_i< c_jai?>aj?,bi?>aj?,ci?<cj?的方案,用三維偏序就好了。

然后a,ca,ca,cb,cb,cb,c的情況也都要做

∣S∣=3|S|=3S=3的話(huà)很麻煩,考慮容斥,總方案(n3)\binom n 3(3n?)減去有一個(gè)下標(biāo)是至少兩個(gè)的最大值。
同樣和上面,先考慮a,ba,ba,b,假設(shè)下標(biāo)iii滿(mǎn)足ai>aj,bi>bja_i>a_j,b_i>b_jai?>aj?,bi?>bj?的情況有kkk種,那么就好有(k2)\binom{k}{2}(2k?)種情況使得iii占據(jù)了至少兩個(gè)最大值。
同理a,ca,ca,cb,cb,cb,c也要做,這是二維偏序,直接樹(shù)狀數(shù)組就好了。

但是發(fā)現(xiàn)對(duì)于iii占據(jù)了三個(gè)最大值的情況我們統(tǒng)計(jì)了三次,需要加回多余的兩次,那么統(tǒng)計(jì)ai>aj,bi>bj,ci>cja_i>a_j,b_i>b_j,c_i>c_jai?>aj?,bi?>bj?,ci?>cj?的個(gè)數(shù)kkk,然后加回k(k?1)k(k-1)k(k?1)的方案就好了,這個(gè)也要三維偏序

代碼里三維偏序用的是CDQCDQCDQ分治+樹(shù)狀數(shù)組

時(shí)間復(fù)雜度O(nlog?2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define lowbit(x) (x&-x) using namespace std; const ll N=1e5+10; struct node{ll a,b,c; }w[N],a[N],b[N]; ll n,ans,sum,t[N],g[N]; void Change(ll x,ll val){while(x<=n){t[x]+=val;x+=lowbit(x);}return; } ll Ask(ll x){ll ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans; } void Merge(ll l,ll mid,ll r){ll p=l,q=mid+1;for(ll i=1;i<=r-l+1;i++){if(p<=mid&&w[p].b<=w[q].b||q>r)b[i]=w[p],p++;else b[i]=w[q],q++;}for(ll i=1;i<=r-l+1;i++)w[l+i-1]=b[i];return; } void CDQ(ll l,ll r,bool op){if(l==r)return;ll mid=(l+r)>>1;CDQ(l,mid,op);CDQ(mid+1,r,op);ll p=l,tmp;for(ll i=mid+1;i<=r;i++){while(p<=mid&&w[p].b<w[i].b)Change(w[p].c,1),p++;sum+=(tmp=Ask(w[i].c));g[w[i].a]+=(op?tmp:0);}for(ll i=l;i<p;i++)Change(w[i].c,-1);Merge(l,mid,r);return; } bool cmp(node x,node y) {return x.a<y.a;} void solve(){sort(w+1,w+1+n,cmp);for(ll i=1;i<=n;i++){ll tmp=Ask(w[i].b);ans-=tmp*(tmp-1)/2;Change(w[i].b,1);}memset(t,0,sizeof(t));return; } signed main() {freopen("subset.in","r",stdin);freopen("subset.out","w",stdout);scanf("%lld",&n);ans=n;for(ll i=1;i<=n;i++)scanf("%lld",&a[i].a);for(ll i=1;i<=n;i++)scanf("%lld",&a[i].b);for(ll i=1;i<=n;i++)scanf("%lld",&a[i].c);for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].b,w[i].c=n-a[i].c+1;sort(w+1,w+1+n,cmp);CDQ(1,n,0);for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].c,w[i].c=n-a[i].b+1;sort(w+1,w+1+n,cmp);CDQ(1,n,0);for(ll i=1;i<=n;i++)w[i].a=a[i].b,w[i].b=a[i].c,w[i].c=n-a[i].a+1;sort(w+1,w+1+n,cmp);CDQ(1,n,0);ans+=sum;ans+=n*(n-1)*(n-2)/6;for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].b;solve();for(ll i=1;i<=n;i++)w[i].a=a[i].b,w[i].b=a[i].c;solve();for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].c;solve();for(ll i=1;i<=n;i++)w[i].a=a[i].a,w[i].b=a[i].b,w[i].c=a[i].c;sort(w+1,w+1+n,cmp);CDQ(1,n,1);for(ll i=1;i<=n;i++)ans+=g[i]*(g[i]-1);printf("%lld\n",ans); }

總結(jié)

以上是生活随笔為你收集整理的YbtOJ#791-子集最值【三维偏序】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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