题目

Description
妖梦在练习剑术
有 n 个木桩排成一排,从左到右高度分别为 h 1 ,h 2 ,h 3 ,…,h n ,这些高度两两不同
妖梦每次可以选择两个相邻的木桩交换,这样的交换可以进行任意多次
妖梦也可以使用符卡:选择两个木桩交换,但最多只能使用一次。
妖梦想要知道将木桩排成从左到右递增的顺序,她最少需要进行多少次交换。

Input
从 sword.in 中读入数据
第一行一个正整数 n
第二行 n 个正整数 h 1 ,h 2 ,…,h n

Output
输出到文件 sword.out 中
一行一个整数,表示最少的交换次数

Sample Input
5
3 5 4 1 2

Sample Output
5

Data Constraint

Hint
(3,5,4,1,2)
交换 1,2 (3,5,4,2,1)
交换 3,4 (3,5,2,4,1)
交换 3,5 (5,3,2,4,1)
交换 2,3 (5,2,3,4,1)
交换 1,5 (1,2,3,4,5)
可以证明这是次数最少的方法

思路

容易发现最优解满足 h[i] 是前缀最大值且 h[j] 为后缀最小值
不妨反过来考虑每个 x 对哪些 (i,j) 有贡献
令 l 为最小的满足 h[l]>h[x] 且 h[l] 为前缀最大值的 l,h[r] 为最大
的满足 h[r]<h[x] 且 h[r] 为后缀最小值的 r
那么 x 的贡献就是 i ∈ [l, x − 1], j ∈ [x + 1,r] 这样一个矩形
问题变为矩形加全局最大值,离线扫描线维护即可
复杂度 O(n log n)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 300005
int L,R,n,yjy,g,ta,tb,cnt,a[N],A[N],B[N],s[N],t[N];
void add(int x,int p) {for(; x <= n; x += x & -x) s[x] += p;
}
int que(int x) {int g = 0;for(; x; x -= x & -x) g += s[x];return g;
}
int F(int x,int y) {while(R < y) add(a[++R],1);while(R > y) add(a[R--],-1);while(L < x) add(a[L++],-1);while(L > x) add(a[--L],1);return que(a[x]) + que(a[x] - 1) - que(a[y]) - que(a[y] - 1) - 2;
}
void work(int l,int r,int ql,int qr) {if (l > r || ql > qr)return;int mid = l + r >> 1,p = 0,g = -1e18,t;for(int i = ql; i <= qr; i++)if (A[i] != B[mid])if (g < (t = F(A[i],B[mid])))g = t,p = i;yjy = max(yjy,g);work(l,mid - 1,ql,p);work(mid + 1,r,p,qr);
}
signed main() {freopen("sword.in","r",stdin); freopen("sword.out","w",stdout);scanf("%lld",&n);bool bz=1;for(int i = 1; i <= n; i++){scanf("%lld",&a[i]),t[i] = a[i];if(a[i]<a[i-1]) bz=0;}if(bz){printf("0"); return 0;}sort(t + 1,t + 1 + n);cnt = unique(t + 1,t + 1 + n) - t - 1;for(int i = 1; i <= n; i++) a[i] = lower_bound(t + 1,t + 1 + cnt,a[i]) - t;for(int i = 1; i <= n; i++) g += i - 1 - que(a[i]),add(a[i],1);if (!g) {puts(cnt == n ? "1" : "0");return 0;}for(int i = 1; i <= n; i++)if (!ta || a[i] > a[A[ta]])A[++ta] = i;for(int i = n; i >= 1; i--)if (!tb || a[i] < a[B[tb]])B[++tb] = i;reverse(B + 1,B + tb + 1);L = 1,R = 0;yjy = -1e18;memset(s,0,sizeof(s));work(1,tb,1,ta);printf("%lld\n",g - yjy);
}

【扫描线】六道剑「一念无量劫」相关推荐

  1. 6691. 【2020.06.05省选模拟】六道剑「一念无量劫」

    题目 一个排列,可以交换任意两个一次,或交换相邻两个无限次. 求排序的最少交换次数. n≤3e5n\leq 3e5n≤3e5 思考历程 显然可以先交换,再求冒泡排序. 先求出逆序对个数,然后问题转化为 ...

  2. 旷视AI「炼丹房」Brain++ 再升级!首席科学家孙剑发AI「灵魂」三问

    来源:新智元 [导读]从深度学习算法.计算机视觉算法到AIoT算法,从开源框架旷视天元到AI生产力平台Brain++,旷视十年故事,旷视首席科学家.旷视研究院院长孙剑讲给你听. 万万没想到,我和小伙伴 ...

  3. 旷视AI「炼丹房」Brain++ 再升级 首席科学家孙剑发AI「灵魂」三问

    万万没想到,我和小伙伴们被旷厂拿去「炼丹」了. 没错,就是这个炼丹炉! 站在炉子中央,各种算法代码眼前飞闪,让我体验了一把时空穿梭的快乐. OMG!真·颅内高潮... 业界认为「炼丹」过程正如算法研究 ...

  4. 微信第一行代码曝光!从「扫地僧」到「地成佛」,张小龙10年磨一剑

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 来源:微博 编辑:卫民 [导读]腾讯官方微博今日凌晨发布了微信10年前在微信后台第一天提交的代码 ...

  5. 大厂「offer 收割机」修炼记

    大家好,我是木叶,现在正值秋招前奏,木叶决定分享一下面试经历,希望对找工作的球友有点帮助,以拿到 offer 的公司为主,搭配败北的公司. 回顾 2020 年 3 月到 10 月的面试经历,也想通过木 ...

  6. 「今天沾一口野味,明天地府相会!」AI如何抗击「野味肺炎」

    河南信阳七星鹏社区宣(来源:@微博-在信阳) 整理 | 阿司匹林 出品 | CSDN云计算 「今天沾一口野味,明天地府相会!」 这是本次在抗战「野味肺炎」一线中表现突出的河南人民打出的标语. 为什么本 ...

  7. “高定美学”品牌矩阵:「莲玉芳华」「琢我」「佐我」佐我气运系列之进击

    WinderRoad稳略全球家族办公室旗下的中国式高阶生活美学代表: FinRise奋睿资本的 "高定美学"品牌矩阵内「莲玉芳华」「琢我」「佐我」又在海内外塑造中国式美学新形象与帮 ...

  8. 中国式“高定美学”燃爆广州秀场!「琢我」之气场与「莲玉芳华」之优雅

    2019年1月21日,作为特邀品牌镇场的「莲玉芳华」「琢我」在广州国际世贸服装城8楼时尚发布中心燃爆秀场.作为 FinRise奋睿资本的 "高定美学"品牌矩阵内中国式高阶生活美学代 ...

  9. 我所知道的中国NLP「破圈」十年

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在,我们已经习惯了全球各类顶级学术会议上的中国力量. 从论文入选,到参会面孔,抑或赞助企业,中国代表几乎无处不在. 前不久刚落幕的ACL ...

最新文章

  1. 探讨UnsupportedOperationException的原因及解决方案
  2. CDH预警配置QQ邮箱
  3. python通过下载链接下载_Python根据URL地址下载文件——wget
  4. Android studio如何更改应用程序的图标以及名称
  5. mysql 排名_SQL语句mysql排名、分组后组内排名、取各组的前几名
  6. 无人驾驶全局路径规划之RRT算法
  7. AWS VPC(二)-----创建VPC Peering
  8. 2011年中国科学院院士增选初步候选…
  9. 阿里开源配置服务diamond分析
  10. UVA_12676_Inverting Huffman(哈夫曼树)
  11. 【运维 | Docker】服务器备份数据库到电脑
  12. 【 MES】 MES的另一视角
  13. ns3中PointToPointDumbbellHelper类的引入方法(哑铃型网络模拟)
  14. [转载]我的时间管理与方法论
  15. 2022年高教社杯全国大学生数学建模竞赛-【赛题解析篇】C题:古代玻璃制品的成分分析与鉴别
  16. 光盘自动运行:如何编写autorun文件
  17. run()和start()方法区别
  18. SILK : SILK_RTP_PayloadFormat 中文翻译(一)
  19. 计算机音乐谱大全桥边姑娘,桥边姑娘-总谱完整版
  20. Linux下select函数实现的聊天服务器

热门文章

  1. c#设计简单飞机行李托运计费系统
  2. ABAC - 基于属性的访问控制 - 复杂场景下访问控制解决之道
  3. VS Code修改语言设置后依旧显示英文的问题解决
  4. FlexboxLayout全攻略(Google官方灵活实现流式布局控件)
  5. 什么是idc,什么又是idc机房?
  6. 计算机视觉:摄像机标定(循序渐进理解到应用)
  7. 国内版firefox启用pocket
  8. python抓取京东联盟优惠券_[爬虫]使用python抓取京东全站数据(商品,店铺,分类,评论)...
  9. c/c++笔试面试题_2
  10. c语言编程思想的题目,c语言方面毕业设计选题范文.docx