【学习笔记】[AGC023E] Inversions
我想到按 a i a_i ai排序,设 b i b_i bi表示第 i i i个位置对应的排名,这样总方案数 ∏ i = 1 n ( a i − i + 1 ) \prod_{i=1}^n{(a_i-i+1)} ∏i=1n(ai−i+1)。
固定 p b i = x p_{b_i}=x pbi=x,那么若 j j j对答案有贡献,应该满足:
1.1 1.1 1.1 b j > b i , p b j < x b_j>b_i,p_{b_j}<x bj>bi,pbj<x
那么,令 a j ← min ( x − 1 , a j ) a_j\gets \min(x-1,a_j) aj←min(x−1,aj)然后算挖掉 x x x后的方案数即可。
瞪眼大法可知,当 a i < a j a_i<a_j ai<aj时,令 a j ← a i a_j\gets a_i aj←ai并不影响其方案数,此时 a i a_i ai, a j a_j aj处于同等地位,那么答案就是总方案数 / 2 /2 /2。对于 a i > a j a_i>a_j ai>aj的情况反过来容斥即可。
考虑优化。注意到我们已经按 a i a_i ai排序了,那么从后往前遍历,线段树上每个点存的是变成 a i a_i ai后的方案数,考虑从 a i a_i ai再变到 a i − 1 a_{i-1} ai−1时,相对位置没有发生变化,那么相当于全局乘一个固定数,线段树查询 b i b_i bi以后的部分即可。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530053.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-01-24 信息学竞赛中的直觉与证明 - 刘汝佳
2022-01-24 AC自动机 - 总结