【题解】[NOI Online 2022 提高组] 如何正确地排序

说实话没想到三维偏序实在是太。。。

k=2

利用轮换性,不难得到答案。

k=3

g ( i , j , k ) = a k , i + a k , j g(i,j,k)=a_{k,i}+a_{k,j} g(i,j,k)=ak,i+ak,j

∑ i = 1 n ∑ j = 1 n ∑ k = 1 3 g ( i , j , k ) − ∑ i = 1 n ∑ j = 1 n ∑ k = 1 3 g ( i , j , k ) [ g ( i , j , k ) 是 中 位 数 ] \sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^3 g(i,j,k)-\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^3g(i,j,k)[g(i,j,k)是中位数] i=1nj=1nk=13g(i,j,k)i=1nj=1nk=13g(i,j,k)[g(i,j,k)]

关于不等式取等的问题,可以将每个数乘 6 ,这样 两个原来和不相等的数的差距现在至少为 6 ,我们把第 2 行每个数 +1 ,第 3 行每个数 +2 ,就能保证不存在相等的情况。

现在我们来跑二维偏序。跑二维偏序时 只需要记录个数 (用树状数组维护)。

∑ i = 1 n ∑ j = 1 n ∑ k = 1 3 g ( i , j , k ) − ∑ i = 1 n ( a 2 , i − x ) × 2 × ∑ j = 1 n [ a i , 1 − a i , 2 < a j , 2 − a j , 1 且 a i , 2 − a i , 3 < a j , 3 − a j , 2 ] \sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^3g(i,j,k)-\sum_{i=1}^n(a_{2,i}-x)\times 2\times\sum_{j=1}^n[a_{i,1}-a_{i,2}<a_{j,2}-a_{j,1} 且a_{i,2}-a_{i,3}<a_{j,3}-a_{j,2}] i=1nj=1nk=13g(i,j,k)i=1n(a2,ix)×2×j=1n[ai,1ai,2<aj,2aj,1ai,2ai,3<aj,3aj,2]

其中 x 表示在原始的行 - 1 。

k=4

当然你可以写三维偏序(233)

h ( i , j , k ) h(i,j,k) h(i,j,k) 表示 s ≠ k s\neq k s=k g ( i , j , s ) g(i,j,s) g(i,j,s) 的中位数。

∑ i = 1 n ∑ j = 1 n ∑ k = 1 4 g ( i , j , k ) − 1 2 ∑ i = 1 n ∑ j = 1 n ∑ k = 1 4 h ( i , j , k ) \sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^4g(i,j,k)-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^4h(i,j,k) i=1nj=1nk=14g(i,j,k)21i=1nj=1nk=14h(i,j,k)

又因为 h ( i , j , k ) = ∑ i = 1 n ∑ j = 1 n ∑ k = 1 3 g ( i , j , k ) [ g ( i , j , k ) 是 中 位 数 ] h(i,j,k)=\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^3g(i,j,k)[g(i,j,k)是中位数] h(i,j,k)=i=1nj=1nk=13g(i,j,k)[g(i,j,k)]

这不就是 k=3 吗 ?

。。。

#include<bits/stdc++.h> #define ll long long #define pi pair<ll,ll> #define fi first #define se second using namespace std; const int N=2e5+5; int n,m; ll a[5][N]; ll b[4][N],c[4][N],res,sum; ll lsh[N],cnt,bit[N]; pi d[N]; struct node{ ll x,y,z; bool operator <(const node &a)const { return x<a.x; } }e[N]; void upd(int x,int k) { for(int i=x;i<=cnt;i+=i&-i) { bit[i]+=k; } } ll qry(int x) { ll tot=0; for(int i=x;i;i-=i&-i) { tot+=bit[i]; } return tot; } //处理二维偏序 ll solve() { ll res=0; int p[4]={0,1,2,3}; do{ for(int i=1;i<=3;i++) { for(int j=1;j<=n;j++) { c[i][j]=b[p[i]][j]; } } cnt=0; for(int j=1;j<=n;j++) { lsh[++cnt]=c[2][j]-c[3][j]; } sort(lsh+1,lsh+1+cnt),cnt=unique(lsh+1,lsh+1+cnt)-lsh-1; memset(bit,0,sizeof bit); for(int j=1;j<=n;j++) { d[j]=make_pair(c[1][j]-c[2][j],c[2][j]-c[3][j]); } sort(d+1,d+1+n); for(int j=1;j<=n;j++) { e[j]={c[2][j]-c[1][j],c[3][j]-c[2][j],c[2][j]}; } sort(e+1,e+1+n); int it=1; for(int j=1;j<=n;j++) { while(it<=n&&d[it].fi<e[j].x) { d[it].se=lower_bound(lsh+1,lsh+1+cnt,d[it].se)-lsh; upd(d[it].se,1); it++; } e[j].y=lower_bound(lsh+1,lsh+1+cnt,e[j].y)-lsh-1; res+=(e[j].z-p[2]+1)*qry(e[j].y)*2; } } while(next_permutation(p+1,p+1+3)); return res; } int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { scanf("%lld",&a[i][j]); a[i][j]*=6; } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { res+=a[i][j]*2*n; } } if(m==2) { printf("%lld",res/6); } else if(m==3) { for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { b[i][j]=a[i][j]+i-1; } } printf("%lld",(res-solve())/6); } else { for(int i=1;i<=m;i++) { int cnt=0; for(int j=1;j<=m;j++) { if(i!=j) { cnt++; for(int k=1;k<=n;k++) { b[cnt][k]=a[j][k]+cnt-1; } } } sum+=solve(); } printf("%lld",(res-sum/2)/6); } }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530179.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(16)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示