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

我们把序列看做两部分,一部分在前表示待排序的,记为序列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. 使用cython库对python代码进行动态编译达到加速效果及python第三方包的制作安装

    1.测试代码:新建  fib.pyx # coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.cl ...

  2. (转)Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)

    http://tech.ddvip.com/2014-09/1411618782213496.html Eclipse CDT调试C++, 使用的Unix的调试器GDB; 由于在Unix下, 文件的目 ...

  3. eclipse maven 项目突然所有的JS方法都失效了

    原因:JS 或者 jQuery 有严重的语法错误

  4. Nginx代理自动上线下线

    Nginx基于连接探测,如果发现后端异常,在单位周期为fail_timeout设置的时间,中达到max_fails次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一 ...

  5. 【Linux-驱动】驱动策略----信号量

    访问共享资源的代码区块叫“临界区”,临界区需要以某种互斥机制加以保护:自旋锁.信号量等.互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问. 信号量:在Liunx中的信号量是一种睡眠 ...

  6. 取(2堆)石子游戏 HDU 2177 博弈论

    取(2堆)石子游戏 HDU 2177 博弈论 题意 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中 ...

  7. JS实现每隔一段时间数量增加或减少

    <div class="minge"> <p>仅剩 <span>126</span>个名额</p> </div&g ...

  8. SpringMVC源码解析

    一:springmvc运行过程: 1. dispatcherServlet 通过 HandlerMapping 找到controller2. controller经过后台逻辑处理得到结果集modela ...

  9. https://www.cnblogs.com/cncc/p/7804511.html?foxhandler=RssReadRenderProcessHandler

    https://www.cnblogs.com/cncc/p/7804511.html?foxhandler=RssReadRenderProcessHandler 一.本文主要是使用Costura. ...

  10. Django框架简易图