CodeForces 830B - Cards Sorting

将每个数字的位置存进该数字的vector中

原数组排个序从小到大处理,每次在vector里二分找到距离当前位置“最远”的位置(相差最大),更新答案

树状数组维护每个数字现在的位置和原位置之差

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 const int N = 100005;
 5 int n;
 6 int a[N], b[N];
 7 vector<int> v[N];
 8 int c[N];
 9 void modify(int x, int num)
10 {
11     while (x <= 100000) c[x] += num, x += x&-x;
12 }
13 int sum(int x)
14 {
15     int s = 0;
16     while (x) s += c[x], x -= x&-x;
17     return s;
18 }
19 int main()
20 {
21     scanf("%d", &n);
22     for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
23     sort(b+1, b+1+n);
24     for (int i = 1; i <= n; i++)
25         v[a[i]].push_back(i);
26     LL ans = 0;
27     int now = 0;
28     for (int i = 1; i <= n;)
29     {
30         int p = lower_bound(v[b[i]].begin(), v[b[i]].end(), now) - v[b[i]].begin();
31         if (p == 0)
32         {
33             int pos = v[b[i]][v[b[i]].size()-1];
34             ans += pos - sum(pos) - (now - sum(now));
35             now = pos;
36         }
37         else
38         {
39             int pos = v[b[i]][p-1];
40             ans += n - sum(n) - (now-sum(now)) + pos - sum(pos);
41             now = pos;
42         }
43         for (int j = 0; j < v[b[i]].size(); j++) modify(v[b[i]][j], 1);
44         i += v[b[i]].size();
45     }
46     cout << ans << endl;
47 }
时间: 2024-12-28 01:32:10

CodeForces 830B - Cards Sorting的相关文章

cf 830B - Cards Sorting 树状数组

B. 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 10

AC日记——Cards Sorting codeforces 830B

Cards Sorting 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005 #define INF 0x3f3f3f3f #define maxtree maxn<<2 int n,ai[maxn],val[maxtree],L[ma

Codeforces Round #424 (Div. 2) E. Cards Sorting(线段树)

题目链接:Codeforces Round #424 (Div. 2) E. Cards Sorting 题意: 将n个数放进一个队列,每次检查队首,看看是不是队列中最小的数,如果是就扔掉,如果不是就放到队尾. 这样直到队列为空,为需要操作多少次. 题解: 考虑用两个指针模拟,最开始now指针指向第一个数,然后nxt指针指向下一个将要被删除的数. 然后我们要算出这里需要移动多少步,然后删掉这个数,一直重复操作,直到将全部的数删完. nxt指针可以用set来维护,now指针可以用并查集来维护. 计

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 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?0

Codeforces 484C Strange Sorting(置换)

题目链接:Codeforces 484C Strange Sorting 题目大意:给定一个长度为N的字符串,现在有M次询问,每次要从左向右逐个对长度为K的子串进行D-sorting,最后 输出生成的串. 解题思路:问题即为一个置换的思想,L对应的左移一位的置换,C对应的是D-sorting前K为的置换,每次执行完一次C 肯定执行一下L,保证D-sorting的为不同的K长度子串.用类似矩阵快速幂的思想对字符串进行求解,最后在有循环移 动对应的N-K位. #include <cstdio> #

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)E. Cards Sorting

题意:有n个数字,我遍历过去,如果他是当前最小值,就删除,否则放到最后面去,问得遍历多少个数字,(直到所有数字消失 思路:我们保存每个数字的位置,这个数字是否能删除,如果他在上一个数字的最后一个位置后面就可以删除了,那么标记下+树状数组(我这里的y表示的就是上一个数删除的最后一个位置) 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 int a[

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

Splay要支持找最左侧的最小值所在的位置.类似线段树一样处理一下,如果左子树最小值等于全局最小值,就查左子树:否则如果当前节点等于全局最小值,就查当前节点:否则查右子树. 为了统计答案,当然还得维护子树大小的函数. 找到位置以后,直接将左右子树交换即可.不需要打标记. 删除节点时,直接将其前驱(是指序列下标的前驱,就是将待删除节点Splay到根后,左子树的最右节点)Splay到根,将其后继(类似)Splay到根的儿子. 然后将后继的左儿子删除即可. 别忘了及时Maintain(); 这份代码的

Codeforces 911E - Stack Sorting

911E - Stack Sorting 思路: 用栈来模拟,能pop就pop,记下一个需要pop的数为temp,那么如果栈非空,栈顶肯定大于temp,那么加入栈 栈顶值-1 到 temp 的值,否则加入栈 n 到 1 的值,如果需要加入的数之前已经出现过,答案则不存在. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define meme(a,b) mem

Codeforces 999F Cards and Joy(二维DP)

题目链接:http://codeforces.com/problemset/problem/999/F 题目大意:有n个人,n*k张卡牌,每个人会发到k张卡牌,每个人都有一种喜欢的卡牌f[i],当一个人拥有x张喜欢的卡牌时会增加h[x]点愉悦值,求合理的发牌方式使得所有人的愉悦值之和最大,输出最大愉悦值.解题思路:设dp[x][y]表示当x个人拥有同一种喜欢的卡牌且该卡牌有y张时的最大愉悦值.则状态转移的根本取决于第x个人拥有几张喜欢的卡牌,所以得到状态转移方程:for (int i = 0;