题目

一个排列,可以交换任意两个一次,或交换相邻两个无限次。
求排序的最少交换次数。
n≤3e5n\leq 3e5n≤3e5


思考历程

显然可以先交换,再求冒泡排序。
先求出逆序对个数,然后问题转化为:找到一对(i,j)(i,j)(i,j)满足∑i<x<j[ai>ax>aj]\sum_{i<x<j}[a_i>a_x>a_j]∑i<x<j​[ai​>ax​>aj​]最大
于是我就非常天真地想到了树套树,并尝试着想去实现一下。
但没多久……
这又区间加区间乘的,树套树怎么合并信息啊!
所以树套树并不是只要是二维就可以干啊
无奈之下写了O(n2lg⁡n)O(n^2\lg n)O(n2lgn)
加了若干优化和剪枝,于是n≤6000n\leq 6000n≤6000稳过,n≤60000n \leq 60000n≤60000能过随机数据。


正解

比赛时半天都没有想到决策单调性,我在干什么……

显然,如果存在ai>aja_i>a_jai​>aj​且i<ji<ji<j,则iii不可能作为右端点。
同理,如果存在ai>aja_i>a_jai​>aj​且i<ji<ji<j,则jjj不可能作为左端点。
接下来可以发现,合法的左端点为前缀最大值,合法的右端点为后缀最小值。

对于一个点xxx,考虑它会对哪些区间造成贡献。
可以二分出它能贡献到的左端点、右端点的范围,对它们的贡献相当于在某个矩形上区间加。
离线之后扫描线,就可以求出最大的贡献。

时间复杂度O(nlg⁡n)O(n \lg n)O(nlgn)


代码

实现的时候不需要对合法的左端点、右端点离散化,因为它们的大小关系不变,矩形交的部分也是不变的。

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 300010
#define ll long long
int n,a[N];
int pre[N],np,suc[N],ns;
struct Oper{int x,l,r,c;
} o[N*2];
int m;
bool cmpo(Oper a,Oper b){return a.x<b.x;}
int t[N*4],tag[N*4];
void change(int k,int l,int r,int st,int en,int c){if (st<=l && r<=en){tag[k]+=c;t[k]+=c;return;}int mid=l+r>>1;if (st<=mid)change(k<<1,l,mid,st,en,c);if (mid<en)change(k<<1|1,mid+1,r,st,en,c);t[k]=max(t[k<<1],t[k<<1|1])+tag[k];
}
int s[N];
void add(int x){for (;x<=n;x+=x&-x)s[x]++;
}
int query(int x){int r=0;for (;x;x-=x&-x)r+=s[x];return r;
}
int main(){//  freopen("in.txt","r",stdin);freopen("sword.in","r",stdin);freopen("sword.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d",&a[i]);for (int i=1,lst=0;i<=n;++i)if (a[i]>lst)pre[++np]=i,lst=a[i];for (int i=n,lst=n+1;i>=1;--i)if (a[i]<lst)suc[++ns]=i,lst=a[i];reverse(suc+1,suc+ns+1);for (int i=1;i<=n;++i){int L=-1,R=-1,l,r;l=1,r=np;while (l<=r){int mid=l+r>>1;if (a[pre[mid]]>a[i])L=pre[mid],r=mid-1;elsel=mid+1;}if (L==-1 || L>i-1)continue;l=1,r=ns;while (l<=r){int mid=l+r>>1;if (a[suc[mid]]<a[i])R=suc[mid],l=mid+1;elser=mid-1;}if (R==-1 || i+1>R)continue;//[L,i-1]*[i+1,R]
//      printf("%d [%d,%d]*[%d,%d]\n",i,L,i-1,i+1,R);o[++m]={L,i+1,R+1,1};o[++m]={i,i+1,R+1,-1};}sort(o+1,o+m+1,cmpo);int ans=0;for (int i=1,j=1;i<=n;++i){for (;j<=m && o[j].x<=i;++j)change(1,1,n,o[j].l,o[j].r,o[j].c);ans=max(ans,t[1]);}ans=ans*2+1;ll sum=0;for (int i=n;i>=1;--i){sum+=query(a[i]);add(a[i]);}printf("%lld\n",min(sum,sum-ans+1));return 0;
}

总结

不要总是一上来就直接想数据结构……
应该要去想想性质,比如单调性什么的……

6691. 【2020.06.05省选模拟】六道剑「一念无量劫」相关推荐

  1. 【扫描线】六道剑「一念无量劫」

    题目 Description 妖梦在练习剑术 有 n 个木桩排成一排,从左到右高度分别为 h 1 ,h 2 ,h 3 ,-,h n ,这些高度两两不同 妖梦每次可以选择两个相邻的木桩交换,这样的交换可 ...

  2. JZOJ6693. 【2020.06.05省选模拟】紫色彼岸樱推迟绽放

    Description 幽幽子饿了,妖梦需要给幽幽子准备食物. 有 T 天,每天幽幽子划分成了 k 个时段,妖梦需要安排每一天的日程. 第 i 天妖梦准备了 D+i-1 道菜,每道菜有无数个.第 1 ...

  3. 6728. 【2020.06.16省选模拟】T2 战棋游戏

    题目 正解 有个比较显然的思路是给特殊点划分到ccc个集合中(集合可以为空). 先解决一个子问题:一条链,两端相同和两端不同的答案分别是什么. 这个东西可以简单递推,然后用矩阵乘法优化. 题解中有个结 ...

  4. 6681. 【2020.06.02省选模拟】图

    题目 给出一个无重边.自环的平面图.需要回答若干个询问,每次询问给出一个简单环,求这个简单环形成的多边形内部有多少个点(包括边界上). n≤1e5,m≤3e5,Q≤3e5n\leq 1e5,m\leq ...

  5. 全国计算机一级photoshop模拟试题,计算机一级photoshop模拟试题练习「附答案」

    一.选择题 1.题目若印刷上要实现大红色,则应设置颜色的数值为?( ) A.M100 B.R255 C.M100Y100 D.M100R100 [答案]C 2.题目以下色彩模式之间的转换无法实现的选项 ...

  6. 6810. 【2020.10.05提高组模拟】路哥

    Description Input Output Sample Input Sample Input1 3 1 1 1 1 1 2 2 3 Sample Input2 9 4 0 0 1 4 1 2 ...

  7. NOIP模拟测试22「位运算」

    范围n-----$100000$   m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$,那么你可以达到任何`一种$n$个$1$的情况 例如 ...

  8. NOIP模拟测试8「匹配·回家」

    匹配 哈希能A 水到爆炸 回家 事实上我做过一个原题,甚至比这个回家难的多,而且那个题多组询问必经点 然后我做一组询问就打炸了 大约就是删了很多东西,然后自己想的太简单了 直接统计了割点,懒得打lca ...

  9. 浙江大学软件学院2020年保研上机模拟练习 7-4 Shopping With Coupons

    目录 解题思路演进过程 第一次程序 第二次程序 第三次程序 解题思路演进过程 首先是题目的理解上:有n个商品,n张优惠券,实际上能买的商品个数最多就是n*n,为啥呢,这题默认是买一个商品必须用一张券, ...

最新文章

  1. 时钟极性和时钟相位概念
  2. python3 RSA 用私钥对随机密钥进行解密
  3. Linux-sudo详解
  4. 怎样添加、移除、移动、复制、创建和查找节点?
  5. 第四篇 Entity Framework Plus 之 Batch Operations
  6. python个人收支管理系统相关题目_练手题:计算人均付费(SQLPython)
  7. devc++源文件未编译_iOS 编译知识小结
  8. 在 里面_适合县城里面加盟的鞋店推荐
  9. Java System.arraycopy()方法示例
  10. windows下git安装配置
  11. ACT开发初步(二)——XML
  12. 2021互联网大厂中秋礼盒大盘点
  13. 【历史上的今天】7 月 5 日:Google 之母出生;同一天诞生的两位图灵奖先驱
  14. deflate php,gzip和deflate的几点区别
  15. 007-绘制三角函数图像(一)
  16. 学栈和队列时的人生感悟
  17. u盘读不出来怎么修复?
  18. MXL90614红外线测温传感器
  19. 计算机怎么设置java环境_怎么设置java环境变量
  20. SQL语句中生成UUID方法

热门文章

  1. OPENCV实现色带检测
  2. 泛微OA集成ERP,助力制造业实现供应商、销售全面数字化管理
  3. (树状数组+逆元)洛谷P5142 区间方差
  4. 在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
  5. 第十四周 任务二
  6. Calculator Conundrum
  7. 4K修复经典老电影背后的科学
  8. 文件存储 云服务器,文件存储 云服务器
  9. 20176408李俊 栈和队列
  10. 车辆侧翻预警系统介绍