Luogu 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】夢重力 题解的更多相关文章
- luogu P1549 棋盘问题(2) 题解
luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...
- 【luogu P2590 [ZJOI2008]树的统计】 题解
题目链接:https://www.luogu.org/problemnew/show/P2590 我想学树剖QAQ #include <cstdio> #include <cstri ...
- 【luogu P2279 [HNOI2003]消防局的设立】 题解
题目链接:https://www.luogu.org/problemnew/show/P2279 想怎么贪怎么贪 #include <queue> #include <cstdio& ...
- 【luogu P2762 太空飞行计划问题】 题解
题目链接:https://www.luogu.org/problemnew/show/P2762 算是拍照那个题的加强下. 输入真的很毒瘤.(都这么说但好像我的过了?) #include <qu ...
- 【luogu P2947 [USACO09MAR]向右看齐Look Up】 题解
题目链接:https://www.luogu.org/problemnew/show/P2947 因为在单调队列上被dalao们锤爆 怒刷单调队列题 何为单调队列? 设我们的队列为从左至右单调递增 对 ...
- 【luogu P1993 小K的农场】 题解
题目链接:https://www.luogu.org/problemnew/show/P1993 1.差分约束: 对于a - b <= c 有一条 b-->a 权值为c 对于a - b & ...
- 【luogu P1726 上白泽慧音】 题解
题目链接:https://www.luogu.org/problemnew/show/P1726 菜 #include <stack> #include <cstdio> #i ...
- 【luogu P2146 [NOI2015]软件包管理器】 题解
题目链接:https://www.luogu.org/problemnew/show/P2146 变量名真毒瘤 我真的再也不把l,left,r,right弄反了 反向思维更好做一些 #include ...
- 【luogu P1314 聪明的质监员】 题解
题目链接:https://www.luogu.org/problemnew/show/P1314 二分答案 但是计算区间贡献的时候 直接暴力会挂 前缀和加速 #include <cstdio&g ...
- 【luogu P3709 大爷的字符串题】 题解
题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...
随机推荐
- iOS自动化测试环境搭建总结
1.关于iOS真机和模拟器自动化环境搭建 参考博文: Appium+Python3+iOS真机环境搭建 iOS自动化测试:mac下iOS10 appium测试环境的搭建 IOS + Appium自动化 ...
- 字符串匹配究极大招【KMP】:带你一步步从原理到构建
目录 前言 KMP原理 什么是前缀表 如何构建前缀表 next数组 使用next数组做匹配 实战演练 前言 一文带你了解如何去理解并实现KMP算法.本文用于记录自己的学习过程,同时向大家进行分享相关的 ...
- CF1573B题解
题意: 对于给定的序列 aA1,aA2,-,aAna_{A1},a_{A2},-,a_{An}aA1,aA2,-,aAn.bB1,bB2,-,bBnb_{B1},b_{B2},-,b_{Bn}b ...
- PHP中的精确计算bcadd,bcsub,bcmul,bcdiv 及 扩展安装
<?php/** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */function math ...
- 【work记录:c++web聊天服务器】解决了聊天窗口的问题|修复了"没有区分好友或者群聊的聊天窗口"的bug|修复了"群聊消息undefined"的bug
日期:2025.4.24 学习内容: 解决了聊天窗口的问题 修复了"没有区分好友或者群聊的聊天窗口"的bug 修复了"群聊消息undefined"的bug 个人 ...
- TablesOfContents.Add 方法 (python3处理Word添加目录)
TablesOfContents.Add 方法 (Word) 返回一 个 TableOfContents 对象,该对象代表添加到文档中的目录. 语法 表达式.Add (Range, UseHeadin ...
- Java开发手册——【强制】所有整型包装类对象之间值的比较,全部使用 equals 方法比较
Java开发手册说明: 对于 Integer var = ? 在-128 至 127 之间的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 I ...
- k8s之ingress反向代理pod
Ingress controller Nginx -->后来改造 Traefik -->也是用于微服务 Envoy -->微服务 Ingress资源 目前使用0.17.1版本ing ...
- SignalR服务端嵌入到WPF
用的是.net framework 4.7.2的WPF. <Window x:Class="EBServerTry.MainWindow" xmlns="http: ...
- 求阶乘末尾0的个数(java)
末尾0的个数 题目描述 输入一个正整数,求n!末尾有多少个0?比如n = 10; n! = 3628800 ,所以答案为2 输入描述 输入为一行,n (1 <= n <= 1000)//输 ...