博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全排列 UVA 11525 Permutation
阅读量:7179 次
发布时间:2019-06-29

本文共 1321 字,大约阅读时间需要 4 分钟。

 

题意:训练指南P248

分析:逆向考虑,比如一个全排列:7345261,它也可以表示成题目中的形式,第一个数字7是由6 * (7 - 1)得到的,第二个数字3有2 * (7 - 2)得到,所以只要树状数组单点修改二分(找最远的因为有些位置是0)查询当前第s[i] + 1的数字(在BIT中指前p项和为s[i] + 1)。

#include 
using namespace std;const int N = 1e5 + 5;int s[N];struct BIT { int c[N], sz; void init(int num) { memset (c, 0, sizeof (c)); sz = num; } void updata(int i, int x) { while (i <= sz) { c[i] += x; i += i & -i; } } int query(int i) { int ret = 0; while (i > 0) { ret += c[i]; i -= i & -i; } return ret; } int bsearch(int l, int r, int kth) { while (l < r) { int mid = l + r >> 1; if (query (mid) < kth) l = mid + 1; else r = mid; } return r; }}bit;int main(void) { int T; scanf ("%d", &T); while (T--) { int k; scanf ("%d", &k); bit.init (k); for (int i=1; i<=k; ++i) { scanf ("%d", &s[i]); bit.updata (i, 1); } for (int i=1; i<=k; ++i) { int p = bit.bsearch (1, k, s[i] + 1); if (i > 1) printf (" "); printf ("%d", p); bit.updata (p, -1); } puts (""); } return 0;}

  

转载于:https://www.cnblogs.com/Running-Time/p/5221635.html

你可能感兴趣的文章
海量高性能列式数据库HiStore技术架构解析
查看>>
Linux块设备驱动之内存模拟块设备
查看>>
「技术大牛」是如何缩短事件平均解决时间的?
查看>>
新人成长:新人如何快速融入技术实力强的前端团队
查看>>
Testing Flutter apps翻译-性能分析
查看>>
手把手教你用 node 玩跳一跳
查看>>
SQL 优化
查看>>
如何在SpringBoot中集成JWT(JSON Web Token)鉴权
查看>>
Redis应用场景及常见问题
查看>>
Sass初入门
查看>>
js常见算法(一):数组去重,打乱数组,统计数组各个元素出现的次数, 字符串各个字符的出现次数,获取地址链接的各个参数...
查看>>
lua 学习总结
查看>>
spring+Kafka+springmvc Demo
查看>>
基于Docker下的MySQL主从复制
查看>>
VUE 面试总结
查看>>
React Native组件开发指南
查看>>
keep-alive:组件级缓存
查看>>
flex 布局基本要点
查看>>
TextWatcher的使用及源码解析
查看>>
linux ssh 免密登录
查看>>