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 < ...
随机推荐
- 本地学习环境minikube安装
有感于K8S太强大和自己的太无知,索性来系统学习下K8S.网上一番攻略,起码先得有个本地学习环境,所以安装一个minikube,下面记录安装过程,供有需要的人使用. 看看minikube架构: 我是在 ...
- 剖析 Docker Swarm 操作对容器端口影响
剖析 Docker Swarm 操作对容器端口影响 一.背景阐述 在使用 Docker Swarm 构建集群环境过程中,于 ts3 节点出现了原有的容器端口全部失效,手动重启后才恢复的情况.期间涉及 ...
- app自动化设计
一.在pom.xml引入依赖 testng:测试框架用例管理 appium:需要用到appium log4j:日志集成 allure:生成报告 二.po分层 分为基础层,page层,用例层,xml文件 ...
- wget--批量下载
wget--批量下载 wget -nd -r -l1 --no-parent --accept=jar http://192.168.38.38:81/js/jartest/ -nd 不创建目录, w ...
- java 单链表实现栈
package com.company;public class Main { //用链表模拟栈 public static void main(String[] args) { // write y ...
- 设计模式之“原型模式(ProtoType)”
一.原型模式(ProtoType) 作用:用原型实例指定创建对象的种类,并且通过拷贝这些原创新的对象 白话解释:用于创建重复的对象,同时有能保证性能(这种类型的设计模式属于创建型设计模式,他提供了一种 ...
- 堆叠、MLAG、VPC、VSS 技术对比及架构建议
堆叠.MLAG.VPC.VSS 技术对比及架构建议 1. 堆叠(Stacking) 技术实现: 多台物理设备通过专用堆叠线缆(如华为的Stack.华三IRF.思科StackWise)或普通光纤/以太网 ...
- AI赋能金融风控:基于机器学习的智能欺诈检测系统实战教程
引言 在数字化转型浪潮中,金融欺诈手段呈现智能化.隐蔽化趋势.传统规则引擎已难以应对复杂多变的欺诈模式,而机器学习技术通过自动学习数据特征,正在重塑金融风控体系.本文将基于Python生态,以信用卡欺 ...
- python实现md5签名
在Python中,hashlib.md5是一个用于计算MD5哈希值的模块.MD5是一种常用的哈希算法,它将输入数据转换为固定长度的哈希值. def get_api_sign(): "&quo ...
- odoo15里面密码与附件加密方式
一.odoo里面用户设置的密码加密方式 加密是用[Passlib生成的PBKDF2 SHA512哈希] 加密后位数是128位 ` def _set_password(self): ctx = self ...