传送门

首先枚举最大值,两边分别求逆序对的做法是错误的,这里是来自战神的hack数据

1 2 100 99 98 3 97 96 95 94 93 92 91

显然3应该跨过最大值到左边去,所以这个做法就没有正确性了

然后正解:

发现最小值一定会被移到最边上,而且因为它最小,就不会再有数跨过它移动

所以这东西没有后效性,且移动后会形成子问题

所以不断取最小值,贪心地取次数最小的方向移动,然后把它删了就行了

  • 所以……要交换序列里的元素,使它们成某种顺序的时候,可以考虑「什么元素不可被跨越」或者「什么元素一定会被移动到什么位置」,然后设法固定这些元素,其余的转化为子问题?

Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long
#define reg register int
#define fir first
#define sec second
#define make make_pair
//#define int long long char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
} int n;
int x[N]; namespace task1{
int uni[N], usize, lim;
int ans=INF, a[N];
inline void upd(int i) {for (; i<=lim; i+=i&-i) ++a[i];}
inline int query(int i) {int ans=0; for (; i; i-=i&-i) ans+=a[i]; return ans;}
void solve() {
for (int i=1; i<=n; ++i) uni[i]=x[i];
sort(uni+1, uni+n+1);
usize=unique(uni+1, uni+n+1)-uni-1; lim=usize+2;
for (int i=1; i<=n; ++i) x[i]=lower_bound(uni+1, uni+usize+1, x[i])-uni+1;
for (int i=1,cnt; i<=n; ++i) {
memset(a+1, 0, sizeof(int)*lim);
cnt=0;
for (int j=i; j; --j) {
cnt+=query(x[j]-1);
upd(x[j]);
}
memset(a+1, 0, sizeof(int)*lim);
for (int j=i+1; j<=n; ++j) {
cnt+=query(x[j]-1);
upd(x[j]);
}
ans=min(ans, cnt);
}
printf("%d\n", ans);
exit(0);
}
} namespace task{
int a[N]; ll ans;
pair<int, int> s[N];
inline void upd(int i) {for (; i<=n; i+=i&-i) ++a[i];}
inline int query(int i) {int ans=0; for (; i; i-=i&-i) ans+=a[i]; return ans;}
inline void del(int i) {for (; i<=n; i+=i&-i) --a[i];}
void solve() {
for (int i=1; i<=n; ++i) upd(i);
for (int i=1; i<=n; ++i) s[i]=make(x[i], i);
sort(s+1, s+n+1);
for (reg pos1=1,pos2=1,top=1,t1,t2; top<=n; pos1=pos2=++top) {
while (top+1<=n && s[pos1].fir==s[top+1].fir) ++top;
pos2=top;
while (pos1<pos2) {
t1=min(query(s[pos1].sec-1), query(n)-query(s[pos1].sec));
t2=min(query(s[pos2].sec-1), query(n)-query(s[pos2].sec));
if (t1<t2) ans+=t1, del(s[pos1++].sec);
else ans+=t2, del(s[pos2--].sec);
}
ans+=min(query(s[pos1].sec-1), query(n)-query(s[pos1].sec)), del(s[pos1].sec);
}
printf("%lld\n", ans);
exit(0);
}
} signed main()
{
n=read();
for (int i=1; i<=n; ++i) x[i]=read();
task::solve(); return 0;
}

题解 Time的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. Jmeter监控服务器CPU,Memory,Disk,Network性能指标

    本文主要说一下如何通过JMeter插件来监控服务器CPU.内存.磁盘.网络等相关资源. 一.下载 第一种方案: 首先进入网址https://jmeter-plugins.org/downloads/o ...

  2. ARTS第二周

    第二周. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的技术文 ...

  3. js--ES6新特性之解构

    前言 es6 中引入了解构这一新特性,了解解构成为一个格合前端必须掌握的基础知识,不仅作为了面试的重要考查知识,同时能极大提高我们平常工作的开发效率.本文来总结一下需要掌握的解构知识点. 正文 1.什 ...

  4. Caffeine缓存的简单介绍

    1.简介 在本文中,我们将了解Caffeine,一个用于Java的高性能缓存库. 缓存和Map之间的一个根本区别是缓存会清理存储的项目. 一个清理策略会决定在某个给定时间哪些对象应该被删除,这个策略直 ...

  5. ROS轮椅

  6. 【Tips】有道云笔记中Markdown插入图片

    在有道云笔记中用MarkDown插入图片 新建一个文档专门用来放图片 把所有要用的图片专门放在一个笔记里,用普通模式先同步笔记,然后用分享笔记 会有一个链接,用浏览器打开这个分享的笔记就能找到所有的图 ...

  7. Hive——连接方式

    Hive--连接方式   一.CLI连接 直接通过CLI连接hive,进行相关hive sql 操作. 直接使用 hive-1.1.0-cdh5.7.0/bin/hive 命令即可 hive> ...

  8. 【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导

    来提供两个正确的做法: 斐波那契数列双倍项的做法(附加证明) 矩阵快速幂 一.双倍项做法 在偶然之中,在百度中翻到了有关于斐波那契数列的词条(传送门),那么我们可以发现一个这个规律$ \frac{F_ ...

  9. javascript学习(五)之标准对象

    一.RegExp:正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则, 凡是符合规则的字符串,我们就认为它"匹配"了,否则,该字符 ...

  10. C++第四十一篇 -- 安装成功的第一个驱动文件

    参考链接:https://blog.csdn.net/LEON1741/article/details/87291839 一.新建工程 二.写一个Driver.c #include <ntddk ...