Cards Sorting
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Vasily has a deck of cards consisting of n cards. There is an integer on each of the cards, this integer is between 1 and 100 000, inclusive. It is possible that some cards have the same integers on them.

Vasily decided to sort the cards. To do this, he repeatedly takes the top card from the deck, and if the number on it equals the minimum number written on the cards in the deck, then he places the card away. Otherwise, he puts it under the deck and takes the next card from the top, and so on. The process ends as soon as there are no cards in the deck. You can assume that Vasily always knows the minimum number written on some card in the remaining deck, but doesn't know where this card (or these cards) is.

You are to determine the total number of times Vasily takes the top card from the deck.

Input

The first line contains single integer n (1 ≤ n ≤ 100 000) — the number of cards in the deck.

The second line contains a sequence of n integers a1, a2, ..., an (1 ≤ ai ≤ 100 000), where ai is the number written on the i-th from top card in the deck.

Output

Print the total number of times Vasily takes the top card from the deck.

Examples
input

Copy
4
6 3 1 2
output

Copy
7
input

Copy
1
1000
output

Copy
1
input

Copy
7
3 3 3 3 3 3 3
output

Copy
7
Note

In the first example Vasily at first looks at the card with number 6 on it, puts it under the deck, then on the card with number 3, puts it under the deck, and then on the card with number 1. He places away the card with 1, because the number written on it is the minimum among the remaining cards. After that the cards from top to bottom are [2, 6, 3]. Then Vasily looks at the top card with number 2 and puts it away. After that the cards from top to bottom are [6, 3]. Then Vasily looks at card 6, puts it under the deck, then at card 3 and puts it away. Then there is only one card with number 6 on it, and Vasily looks at it and puts it away. Thus, in total Vasily looks at 7 cards.

题意:给你n个数,这些数可能重复,每次取出当前第一个数,如果这个数是这些数中的最小值,则扔掉,否则放到最后

思路:若取出的这个数是最小的,则这些数的总数要减1,否则要放到末尾,如果我们把这些数都取了一遍,会发现下一个取数的周期中原来的数相对位置是不变的,比如说123->231->312->123

若要取出一个数,则必须先把它前面的那些数取出来,若要取末尾那个数,则其前面那些数都要被取出,即取出了这些数的总个数
首先我们记录数对应的下标有哪些,每次要取出最小的那个,所以我们先排个序从最小的那个开始找
一开始总数是n,第一次必定会把当前所有的数都取一遍,所以设答案初始值为n,现在从第一位开始找,设mid=1
每次会找大于等于mid的下标,如果找不到,会返回end()地址(也就是说当前集合中不存在大于等于mid的那个数)
如果找不到了,比如说上一个mid=4,而这个元素总只有1的下标,说明我们已经找过一次当前的所以数了,要把总数加上重新从开头找
每次要删掉当前最小的那个,同时总数减一

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int amn=1e5+;
int a[amn];
set<int> p[amn];
set<int>::iterator k;
int main(){
int n;
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i];
p[a[i]].insert(i); ///记录数对应的下标有哪些
}
sort(a+,a++n); ///每次要取出最小的那个,所以我们先排个序从最小的那个开始找
ll tot=n,mid=,ans=n; ///一开始总数是n,第一次必定会把当前所有的数都取一遍,所以设答案初始值为n,现在从第一位开始找,设mid=1
for(int i=;i<=n;i++){
k=p[a[i]].lower_bound(mid); ///每次会找大于等于mid的下标,如果找不到,会返回end()地址(也就是说当前集合中不存在大于等于mid的那个数)
if(k==p[a[i]].end()){ ///如果找不到了,比如说上一个mid=4,而这个元素总只有1的下标,说明我们已经找过一次当前的所以数了,要把总数加上重新从开头找
ans+=tot; ///我们找过了所有数一遍,所以加上数的总个数
mid=; ///重新从第一位开始找
k=p[a[i]].lower_bound(mid);
}
mid=*k;
p[a[i]].erase(k); ///删掉当前最小的那个
tot--; ///同时总数减一
}
printf("%lld\n",ans);
}
/***
给你n个数,这些数可能重复,每次取出当前第一个数,如果这个数是这些数中的最小值,则扔掉,否则放到最后
若取出的这个数是最小的,则这些数的总数要减1,否则要放到末尾,如果我们把这些数都取了一遍,会发现下一个取数的周期中原来的数相对位置是不变的,比如说123->231->312->123
若要取出一个数,则必须先把它前面的那些数取出来,若要取末尾那个数,则其前面那些数都要被取出,即取出了这些数的总个数
首先我们记录数对应的下标有哪些,每次要取出最小的那个,所以我们先排个序从最小的那个开始找
一开始总数是n,第一次必定会把当前所有的数都取一遍,所以设答案初始值为n,现在从第一位开始找,设mid=1
每次会找大于等于mid的下标,如果找不到,会返回end()地址(也就是说当前集合中不存在大于等于mid的那个数)
如果找不到了,比如说上一个mid=4,而这个元素总只有1的下标,说明我们已经找过一次当前的所以数了,要把总数加上重新从开头找
每次要删掉当前最小的那个,同时总数减一
***/

[set]Codeforces 830B-Cards Sorting的更多相关文章

  1. Codeforces 830B - Cards Sorting 树状数组

    B. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  2. CodeForces 830B - Cards Sorting

    将每个数字的位置存进该数字的vector中 原数组排个序从小到大处理,每次在vector里二分找到距离当前位置“最远”的位置(相差最大),更新答案 树状数组维护每个数字现在的位置和原位置之差 #inc ...

  3. AC日记——Cards Sorting codeforces 830B

    Cards Sorting 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  4. codeforces 830 B Cards Sorting

    B. Cards Sorting  http://codeforces.com/problemset/problem/830/B Vasily has a deck of cards consisti ...

  5. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) E. Cards Sorting 树状数组

    E. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Cards Sorting(树状数组)

    Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. codeforces 830 B. Cards Sorting(线段树)

    题目链接:http://codeforces.com/contest/830/problem/B 题解:其实这题就是求当前大小的数到下一个大小的数直接有多少个数,这时候可以利用数据结构来查询它们之间有 ...

  8. Codeforces Round #424 Div2 E. Cards Sorting

    我只能说真的看不懂题解的做法 我的做法就是线段树维护,毕竟每个数的顺序不变嘛 那么单点维护 区间剩余卡片和最小值 每次知道最小值之后,怎么知道需要修改的位置呢 直接从每种数维护的set找到现在需要修改 ...

  9. Codeforces Round #424 E. Cards Sorting

    题目大意:给你一堆n张牌(数字可以相同),你只能从上面取牌,如果是当前牌堆里面最小的值则拿走, 否则放到底部,问你一共要操作多少次. 思路:讲不清楚,具体看代码.. #include<bits/ ...

  10. 【Splay】Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) B. Cards Sorting

    Splay要支持找最左侧的最小值所在的位置.类似线段树一样处理一下,如果左子树最小值等于全局最小值,就查左子树:否则如果当前节点等于全局最小值,就查当前节点:否则查右子树. 为了统计答案,当然还得维护 ...

随机推荐

  1. 【深入理解Java虚拟机】类的初始化过程

    类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...

  2. USB小白学习之路(3) 通过自定义请求存取外部RAM

    通过自定义请求存取外部RAM 1. 实验简述 此实验是对自定义的供应商特殊命令(vendor specific command bRequest = 0xA3)进行解析,程序中的read me说明如下 ...

  3. C#编程_单线程IP地址解析

    单线程IP地址解析 目标程序 界面如下图 ​ 设计方法:完成单个IP地址解析,循环调用方法,完成扫描. 注意用stopwatch计算时间. 实现思路 先知道怎么解析一个单个的IP地址. 用循环的方法解 ...

  4. 全栈前端入门必看 koa2+mysql+vue+vant 构建简单版移动端博客

    koa2+mysql+vue+vant 构建简单版移动端博客 具体内容展示 开始正文 github地址 <br/> 觉得对你有帮助的话,可以star一下^_^必须安装:<br/> ...

  5. [LeetCode] 994. Rotting Oranges 腐烂的橘子

    题目: 思路: 每个腐烂的橘子都能将自己上下左右的新鲜橘子传染,像极了现在的肺炎... 如果格子中只有一个腐烂的橘子,那么这便是一个典型的层次遍历,第一个传染多个,称为第二层,第二层传染第三层 但这里 ...

  6. 基于 Redis 实现 CAS 操作

    基于 Redis 实现 CAS 操作 Intro 在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS (Compare And Swap) ...

  7. 自己查与写的批量比较bash

    前言:互测的时候一个一个输入感觉太麻烦,于是尝试写自己的对拍,又想到os刚学了bash命令行处理,于是想把两者结合一下减轻自己的工作量 分两步: 将所有人的工程导出成jar文件 放到linux下用ba ...

  8. 数据加密标准(DES)详解

    1 简介 1.1 历史 DES(Data Encryption Standard)是由IBM公司在1974年提出的加密算法,在1977年被NIST定位数据加密标准.随后的很多年里,DES都是最流行的对 ...

  9. Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...

  10. VUE四 axios详解

    axios的中文文档写的已经很详细 https://www.kancloud.cn/yunye/axios/234845