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

本文共 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

你可能感兴趣的文章
DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.7Beta) 增加多语言!
查看>>
spring- 4.2.4
查看>>
基本数据结构学习总结: 二叉树的基本操作
查看>>
迟到的第四周
查看>>
09-数据库的备份和恢复
查看>>
JavaScript 实现深度拷贝
查看>>
【BZOJ1598】牛跑步 [A*搜索]
查看>>
直方图部分
查看>>
内存泄漏检测【转】
查看>>
快速排序,冒泡排序时间复杂度推导
查看>>
JavaScript 获取当前时间戳
查看>>
基础汇编指令
查看>>
C语言钙片
查看>>
《AjaxPro 教程系列》 一、环境配置和经典用例AutoComplete功能的实现
查看>>
spring+quartz的任务调度
查看>>
ActiveMq 总结(一)
查看>>
XJOI网上同步测试DAY14 T2
查看>>
在SGD中发布Oracle Linux 7 的Xfce桌面环境
查看>>
使用DD_belatedPNG让IE6支持PNG透明图片
查看>>
LOJ6284 数列分块入门8(分块)
查看>>