拿到这个问题,我们从头开始思考。

我们把序列看做两部分,一部分在前表示待排序的,记为序列1,一部分在后表示已排序的,记为序列2

因为序列2在后,所以不必担心它影响序列1的排序,那么对于序列1的第一个元素,显然珂以放到序列2的某个对应位置,使序列2仍然保持有序

那么很简单,我们发现只需要将序列1每个元素都移动一次即可完成排序,这显然是最优的

讲一下初始化,对于序列2,我们发现显然从最后一个逆序对的第二个元素开始一直到序列的最后一个元素珂以直接作为序列2的,那么剩下的元素按原来的顺序放入序列1,接下来我们珂以直接模拟这个操作。

目前的复杂度是\(\Theta(n^2)\),显然对于本题来说无法通过。

那么消耗时间比较多的部分是什么呢?就是如何找到序列1的第一个元素在序列2中的对应位置(换而言之就是计算答案)。

我们需要在\(\Theta(log_2n)\)的时间内求出序列1的第一个元素在序列2中的对应位置(为什么是\(\Theta(log_2n)\)而不是\(\Theta(1)\)看数据范围就知道啦)。首先我们发现序列2是有序的,无需模拟,然后怎么做呢?基于\(\Theta(log_2n)\)的复杂度,我们想到了神奇的树状数组,开始在序列2中的所有元素的位置上插入一个1,然后对于序列1的第i个元素,记为\(a_i\),我们只需要查询\([1,a_i)\)有几个数就知道答案了,然后再往\(a_i\)的位置上插入一个1,持续模拟即可。

好了放个代码

#include <cstdio>
#include <vector>
#define ll long long using namespace std; ll read(){
ll x = 0; int zf = 1; char ch = ' ';
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;
} int p[100005];
int fen[100005]; #define lowbit(x) (x&(-x)) int n; void add(int pos){
for ( ; pos <= n; pos += lowbit(pos)) ++fen[pos];
} int query(int pos){
int sum = 0;
for ( ; pos; pos -= lowbit(pos)) sum += fen[pos];
return sum;
} vector<int> ans(0); int main(){
n = read(); bool flg = 1;
for (int i = 1; i <= n; ++i){
p[i] = read();
if (p[i] != i) flg = 0;
}
if (flg){puts("0"); return 0;}
int i;
for (i = n; i >= 1; --i)
if (p[i] < p[i - 1])
break;
for (int j = i; j <= n; ++j)
add(p[j]);
for (int j = 1; j < i; ++j){
ans.push_back(query(p[j]) + i - j - 1);
add(p[j]);
}
printf("%d\n", ans.size());
for (int j = 0; j < ans.size(); ++j)
printf("%d%c", ans[j], ((j == ans.size() - 1) ? '\n' : ' '));
return 0;
}

[USACO2019JAN]Sleepy Cow Sorting题解的更多相关文章

  1. 树状数组 || 线段树 || Luogu P5200 [USACO19JAN]Sleepy Cow Sorting

    题面:P5200 [USACO19JAN]Sleepy Cow Sorting 题解: 最小操作次数(记为k)即为将序列倒着找第一个P[i]>P[i+1]的下标,然后将序列分成三部分:前缀部分( ...

  2. LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组

    \(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...

  3. P5200 [USACO19JAN]Sleepy Cow Sorting

    P5200 [USACO19JAN]Sleepy Cow Sorting 题目描述 Farmer John正在尝试将他的N头奶牛(1≤N≤10^5),方便起见编号为1…N,在她们前往牧草地吃早餐之前排 ...

  4. P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D 迷路的牛 (贪心)

    链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  5. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

  6. Cow Sorting(置换群)

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6664   Accepted: 2602 Descr ...

  7. hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  9. hdu 2838 Cow Sorting(树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. postman杂记

    接到测试任务,测试6个接口 rap2 上的接口比较多,整体导出内容太多 就一个接口一个接口的,复制到了postman上 rap2部分接口,开发没有备注简介内容:通知开发备注下 对接口的理解,还是靠功能 ...

  2. Ubuntu 16.04 设置静态IP 注意事项

    目录 查看动态ip下的网络信息 查看默认网关 设置静态网络 查看动态ip下的网络信息 1 ifconifg # 查看网卡信息: 可以看出网口名称为 eno1, 以及子网掩码(mask) 查看默认网关 ...

  3. 应用安全 - 无文件式攻击 - 潜伏型攻击 - WMI - 汇总

    wbemtest.exe Windows XP Windows 10

  4. Redis为什么不能使用一主一从哨兵

    哨兵机制 识别挂掉的主节点 quorum(法定人数) 是判定主节点不能访问所需要的最少哨兵数量 执行失效备援perform a failover 其中一个哨兵需要被选为救援的领导,并被授权执行救援,而 ...

  5. docker私有仓库-harbor

    简单说一下Harbor的部署,踩了几个坑,参考同事大神的配置文件,一脸懵逼的部署出来了,其中部分内容参考了网上一些大神的文档,本篇文章仅供参考学习,如有雷同,万分荣幸. 这篇文档仅限于centos7参 ...

  6. Java基础语法—数据输入

    我们可以通过 Scanner 类来获取用户的输入.使用步骤如下: 1.导包.Scanner 类在java.util包下,所以需要将该类导入.导包的语句需要定义在类的上面. import java.ut ...

  7. nrm安装与配置

    nrm安装与配置:https://blog.csdn.net/anway12138/article/details/79455224

  8. Luogu P2168 [NOI2015]荷马史诗

    题目 哈夫曼树的每个叶子结点都有一个权值(表示某数据的出现频率),且\(\sum dis_ival_i\)最小. 哈夫曼树中,权值和越大的集合离根节点越近. 而每个数据对应从根节点到该叶子结点的一种编 ...

  9. H264 RTP包解析

    1.  预备 视频: 由一副副连续的图像构成,由于数据量比较大,因此为了节省带宽以及存储,就需要进行必要的压缩与解压缩,也就是编解码. h264裸码流: 对一个图像或者一个视频序列进行压缩,即产生码流 ...

  10. HDU 2196 Computer( 树上节点的最远距离 )

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...