P11158 【MX-X6-T4】夢重力

分类讨论好题。

不难发现交换行等价于交换列,考虑转化贡献体,枚举长度为 \(\frac{n}{2}\) 区间,统计这个区间被多少种交换方式包含。

考虑一个长度为 \(\frac{n}{2}\) 区间满足要求的充要条件是存在一段空权值区间 \([x,x+\frac{n}{2}]\) 使得区间中所有 \(p_i\) 不属于 \([x,x+\frac{n}{2}]\)。注意到如果存在满足要求的区间则其余每一行都必然有数,且上边界必然在 \([\frac{n}{2}+1,n]\),下边界必然在 \([1,\frac{n}{2}]\),所以我们维护 \([1,\frac{n}{2}]\) 中的最大值和 \([\frac{n}{2}+1,n]\) 中的最小值即可判定是否存在满足要求的区间。可以使用 set 维护。

如果这个区间本身就满足要求,那么在区间内部交换或区间外部交换没有影响,对答案贡献 \(\frac{\frac{n}{2}\times(\frac{n}{2}-1)}{2}\times 2=\frac{n}{2}\times(\frac{n}{2}-1)\)。但是如果 \([1,\frac{n}{2}]\) 中有数,我们可以把 \([1,\frac{n}{2}]\) 中的最大值换成一个较小的上边界,同样满足条件。如果 \([\frac{n}{2}+1,n]\) 中有数同理。需要特判一下。

如果这个区间本身不满足要求,还是有可能通过交换得到满足要求的区间。不难发现此时一定是换掉 \([1,\frac{n}{2}]\) 中的最大值或 \([\frac{n}{2}+1,n]\) 中的最小值,于是我们分别计算一下换掉之后的区间大小即可。注意如果换掉之后空权值区间长度大于 \(\frac{n}{2}\),则有两种换法,如果空权值区间长度等于 \(\frac{n}{2}\),则只有一种换法。这个结论手玩一下不难发现。

然后就做完了,时间复杂度 \(O(n\log n)\)。

#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;
}

Luogu P11158 【MX-X6-T4】夢重力 题解的更多相关文章

  1. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  2. 【luogu P2590 [ZJOI2008]树的统计】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2590 我想学树剖QAQ #include <cstdio> #include <cstri ...

  3. 【luogu P2279 [HNOI2003]消防局的设立】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2279 想怎么贪怎么贪 #include <queue> #include <cstdio& ...

  4. 【luogu P2762 太空飞行计划问题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2762 算是拍照那个题的加强下. 输入真的很毒瘤.(都这么说但好像我的过了?) #include <qu ...

  5. 【luogu P2947 [USACO09MAR]向右看齐Look Up】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2947 因为在单调队列上被dalao们锤爆 怒刷单调队列题 何为单调队列? 设我们的队列为从左至右单调递增 对 ...

  6. 【luogu P1993 小K的农场】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1993 1.差分约束: 对于a - b <= c 有一条 b-->a 权值为c 对于a - b & ...

  7. 【luogu P1726 上白泽慧音】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1726 菜 #include <stack> #include <cstdio> #i ...

  8. 【luogu P2146 [NOI2015]软件包管理器】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2146 变量名真毒瘤 我真的再也不把l,left,r,right弄反了 反向思维更好做一些 #include ...

  9. 【luogu P1314 聪明的质监员】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1314 二分答案 但是计算区间贡献的时候 直接暴力会挂 前缀和加速 #include <cstdio&g ...

  10. 【luogu P3709 大爷的字符串题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...

随机推荐

  1. 阿里云服务器中Linux下centos7.6安装JDK

    一.下载jdk安装包 wget https://imcfile.oss-cn-beijing.aliyuncs.com/shizhan/file/liaoshixiong/jdk-8u231-linu ...

  2. Windows系统设置开机自启动+分块压缩+文件共享

    开机自启动+分块压缩+文件共享 一.设置开机自启动 win+R 打开运行窗口,输入 shell:startup 此时桌面会弹出一个目录文件夹,只需要将需要启动的软件放入该文件夹即可开机自启. C:\U ...

  3. Navicat Premiun已经停止工作

    与网易有道词典冲突.退出词典即可.

  4. JS如何实现远程控制:一步步教你掌握技术

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  5. AssemblyResolve巧解未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0的问题

    问题:未能加载文件或程序集"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aee ...

  6. 物联网之使用Vertx实现TCP最佳实践【响应式】

    小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现TCP-Server 实现TCP-Server[响应式] Vertx-Core地址 实现过程 查看源码 代码比较简单,懒得讲解啦 代码比较简 ...

  7. Alexander ——2024年报

    Alexander --2024年报 小总结 知己知彼,百战不殆.2024下半年找到了自己学习的方向,也认识很多的师傅,深入领域学习,无时不刻不在CTF的路上,逐渐建立一个完整的知识库体系. 今年的成 ...

  8. OS期末复习总结

    期末样题 : 链接:https://pan.baidu.com/s/12Mfi_lnhBDbuke6B_qCiJg 提取码:khp7 一.易错易混点: 下列进程调度算法中,可能引起进程长时间得不到运行 ...

  9. RBMQ案例二:工作队列模式

    工作队列模式 工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务而不得不等待它完成.相反,我们安排任务稍后完成.我们将任务封装 为消息并将其发送到队列.在后台运行的工作进程将弹出任务 ...

  10. 【Java】汉字转拼音

    将汉字转成拼音及汉字首字母,可以使用jar包 pingyin4j,但是遇到多音节汉字就会有问题.如果使用大名鼎鼎的jpinyin,可以自动识别常见多音字,而且还支持简体转换为繁体,检查是简体还是繁体, ...