[USACO2019JAN]Sleepy Cow Sorting题解
拿到这个问题,我们从头开始思考。
我们把序列看做两部分,一部分在前表示待排序的,记为序列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题解的更多相关文章
- 树状数组 || 线段树 || Luogu P5200 [USACO19JAN]Sleepy Cow Sorting
题面:P5200 [USACO19JAN]Sleepy Cow Sorting 题解: 最小操作次数(记为k)即为将序列倒着找第一个P[i]>P[i+1]的下标,然后将序列分成三部分:前缀部分( ...
- LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
\(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...
- P5200 [USACO19JAN]Sleepy Cow Sorting
P5200 [USACO19JAN]Sleepy Cow Sorting 题目描述 Farmer John正在尝试将他的N头奶牛(1≤N≤10^5),方便起见编号为1…N,在她们前往牧草地吃早餐之前排 ...
- P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D 迷路的牛 (贪心)
链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
- BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 215[S ...
- Cow Sorting(置换群)
Cow Sorting Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6664 Accepted: 2602 Descr ...
- hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU Cow Sorting (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1 ...
- hdu 2838 Cow Sorting(树状数组)
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- xmake新增对WDK驱动编译环境支持
xmake v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmak ...
- Java实验3与第五周总结
1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) •统计该字符串中字母s出现的次数. •统计该字符串中子串" ...
- 在laravel框架中使用mq
本文写于2018-11-28 1.部署laravel项目 https://github.com/laravel/laravel 通过git克隆项目,或者下载zip包然后解压等方式都可以把larave ...
- Dubbo原理学习
Dubbo源码及原理学习 阿里中间件团队博客 Dubbo官网 Dubbo源码解析 Dubbo源码解析-掘金 Dubbo源码解析-赵计刚 Dubbo系列 源码总结+最近感悟
- The kth great number
The kth great number Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. I ...
- python学习-第四天补充-面向对象
python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的p ...
- 一些DP上的奇奇怪怪的东西
单调队列&单调栈: 有手就行.jpg 四边形不等式: 若\(w(i,j)\)满足\(\forall a\le b<c\le d,w(a,c)+w(b,d)\le w(b,c)+w(a,d ...
- [LeetCode] 113. 路径总和 II
题目链接 : https://leetcode-cn.com/problems/path-sum-ii/ 题目描述: 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径 ...
- PY 个板子计划【雾
各类板子计划 A+B √ 放个鬼的链接[雾 欧拉筛 √ https://www.cnblogs.com/Judge/p/11690114.html 树状数组 √ 惨痛的教训,以后咱打数据结构的时候绝对 ...
- [Nest] 01.初见nest.js
github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...