Codeforces Round #424 (Div. 2) E. Cards Sorting(思维 树状数组)
来源:互联网 发布:服装设计用什么软件 编辑:程序博客网 时间:2024/06/06 14:15
题意:有n张牌,每张牌上有一个数,每次从牌顶取一张牌,如果这张牌是剩余牌中的最小值那么就把它扔掉,不然放到牌堆底,问
多少次操作才能把牌扔光。
思路:树状数组维护每个位置的牌是否存在,这样就能logn计算两个位置之间牌数,一共只有1e5个数,这样我们就可以从1开始枚
举模拟(一开始开一个1e5的vector把每个数的下标存进去),如果存在这个数,就从当前位置把所有的这个数拿完,记录维护下走
到的位置和操作步数,并将拿走的位置更新为0.
代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5+5;int tree[maxn], a[maxn];vector<int> g[maxn];int lowbit(int x) { return x&(-x); }void update(int pos, int val){ while(pos < maxn) { tree[pos] += val; pos += lowbit(pos); }}int query(int pos){ int sum = 0; while(pos) { sum += tree[pos]; pos -= lowbit(pos); } return sum;}int Find(int i, int p){ int l = 0, r = g[i].size()-1, ans = 0; while(l <= r) { int mid = (l+r)/2; if(g[i][mid] >= p) ans = mid, r = mid-1; else l = mid+1; } return ans;}int dis(int l, int r){ if(l > r) return query(r)+query(maxn-1)-query(l); else return query(r)-query(l);}int main(void){ int n; while(cin >> n) { memset(tree, 0, sizeof(tree)); for(int i = 0; i < maxn; i++) g[i].clear(); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); g[a[i]].push_back(i); update(i, 1); } int now = 0; ll ans = 0; for(int i = 1; i < maxn; i++) { if(g[i].size() == 0) continue; int tmp = Find(i, now); //找到最近的下一个 int e = g[i].size(); //把i取完 for(int j = tmp; j < e; j++) { ans += dis(now, g[i][j]); now = g[i][j]; update(now, -1); } for(int j = 0; j < tmp; j++) { ans += dis(now, g[i][j]); now = g[i][j]; update(now, -1); } } printf("%I64d\n", ans); } return 0;}
阅读全文
1 0
- Codeforces Round #424 (Div. 2) E. Cards Sorting(树状数组)
- Codeforces Round #424 (Div. 2) E. Cards Sorting(思维 树状数组)
- Codeforces Round #424 (Div. 2, )-树状数组|线段树-E. Cards Sorting
- Codeforces Round #424 (Div. 2)C. Jury Marks 暴力 D. Office Keys 二分 E. Cards Sorting 树状数组
- Codeforces-831E Cards Sorting(树状数组)
- Codeforces Round #227 (Div. 2)---E. George and Cards(贪心, 树状数组+set维护, 好题!)
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) E Cards Sorting
- Codeforces Round #424 Div2 E. Cards Sorting
- Codeforces Round #424 E. Cards Sorting
- Codeforces 831 E. Cards Sorting set+树状数组模拟
- Codeforces Round #225 (Div. 2)(B思维题,E:dfs+树状数组)
- Codeforce#424E. Cards Sorting(脑洞+树状数组)
- 树状数组Codeforces Round #301 (Div. 2) E - Infinite Inversions
- Codeforces Round #368 (Div. 2) E. Garlands (树状数组)
- Codeforces Round #368 (Div. 2) E. Garlands 二维树状数组
- Codeforces Round #368 (Div. 2) E. Garlands(二维树状数组)
- Codeforces Round #423 (Div. 2) E. DNA Evolution(树状数组)
- Codeforces Round #368 (Div. 2) E. Garlands 二维树状数组
- ubuntu下hadoop安装过程中遇到的问题
- 分享一个不错的文章
- 比特币客户端Electrum使用介绍
- 三.使用连接池操作Redis
- Kotlin入门-HelloKotlin
- Codeforces Round #424 (Div. 2) E. Cards Sorting(思维 树状数组)
- 组装MySQL执行文件(重定向示例)
- Ubuntu桌面通知
- 一个前端攻城狮的全栈之路第五弹:mongoose简单使用(实现对mongodb的增、删、改、查)
- 170714 逆向-溯源
- 继承及其方法重写
- mysql pdo bindValue和bindparam的区别
- java.util.Date与Java.sql.Date的区别与相互转换
- C#链接SQLServer数据库代码