题面:https://codeforces.com/contest/1698/problem/E
大致题意:给定a排列、b排列的部分、数值s,规定可对a排列进行如下操作:在第i次操作时,可选定下标范围在i~i+s的两个数值,进行交换(若选定的两个下标相同,则排列不变,可视为跳过一次操作)
求通过若干次操作,能使a排列变为b排列的b排列总数
题解:易想到,先求解怎样的b排列符合条件,即假定一个特定的b排列,判断是否满足条件。先上结论:若,则符合条件
证明如下:
- 证明:将b按大小与a一起重排后,按照新的排列考虑问题不影响结果(因为a数组已经固定,故可以理解为对a数组进行重新”投射”)
- 按的大小从小到大考虑问题,若=m,大于m,则前几次操作不会涉及(因为其大于m,与前面的b不会对应);若,则不需移动,且第i次操作可直接放弃而不造成影响;若,此时a中的m所对应b大于m,则在考虑中,已将其调到另外一个b处,必定可以完成操作
- 欲证明,若=m,大于m,则使a归位需要的s最少为a、b之差,按b大小重排后则所需,等效到原排列中s不变
- 已知s,对每个未知b,可知道其可能值的个数(可能值从小到大排),故从可能值个数较小的b开始考虑
1 |
|
码力太弱哩,就嗯写,时间复杂度大概是nlogn