w9095
2024-10-03 22:49:29
P11158 【MX-X6-T4】夢重力
分类讨论好题。
不难发现交换行等价于交换列,考虑转化贡献体,枚举长度为
考虑一个长度为 set
维护。
如果这个区间本身就满足要求,那么在区间内部交换或区间外部交换没有影响,对答案贡献
如果这个区间本身不满足要求,还是有可能通过交换得到满足要求的区间。不难发现此时一定是换掉
然后就做完了,时间复杂度
#include <bits/stdc++.h>
using namespace std;
long long n,a[500000],cs=0,cb=0,ans=0;
set<long long>q;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
q.insert(0),q.insert(n+1);
for(int i=1;i<=n/2;i++)q.insert(a[i]);
for(int i=1;i<=n/2+1;i++)
{
set<long long>::iterator mx=q.lower_bound(n/2+1),mi=q.upper_bound(n/2),tmp=mx;
mi--;
if((*mx)-(*mi)-1>=n/2)
{
ans+=(n/2)*(n/2-1);
if((*mx)!=n+1)ans++;
if((*mi)!=0)ans++;
}
else
{
mx++;
if((*mx)-(*mi)-1>n/2)ans+=2;
else if((*mx)-(*mi)-1==n/2)ans++;
mx=tmp,mi--;
if((*mx)-(*mi)-1>n/2)ans+=2;
else if((*mx)-(*mi)-1==n/2)ans++;
}
q.insert(a[i+n/2]),q.erase(a[i]);
}
printf("%lld\n",ans);
return 0;
}