[YY]已知逆序列求原序列(二分,树状数组)
在看组合数学,看到逆序列这个概念。于是YY了一道题:已知逆序列,求出原序列。
例子:
元素个数 n = 8
逆序列 a={5,3,4,0,2,1,1,0}
则有原序列 p={4,8,6,2,5,1,3,7}
思路蛮简单的,但是复杂度是O(2*N*lgN)的,不知道有没有O(N)的算法。
bit维护点[1,i]的所有空位置,则可以知道这个数列是单调递增的。
每一次去找满足i的逆序列ai+1的最左的空位pos(因为考虑不包括当前位置的空位数),然后更新[pos-1,n]所有空位-1(在pos处插入i)。因为[1,i]的位置都是单调的,所以可以二分来找。
#include <bits/stdc++.h>
using namespace std; #define lowbit(x) x & (-x)
const int maxn = ;
int n;
int a[maxn], b[maxn];
int bit[maxn]; void update(int i, int x) {
while(i <= n) {
bit[i] += x;
i += lowbit(i);
}
} int sum(int i) {
int ret = ;
while(i) {
ret += bit[i];
i -= lowbit(i);
}
return ret;
} void init() {
memset(a, , sizeof(a));
memset(b, , sizeof(b));
memset(bit, , sizeof(bit));
for(int i = ; i <= n + ; i++) {
update(i, );
}
} int lb(int val) {
int lo = , hi = n;
while(lo <= hi) {
int mid = (lo + hi) >> ;
int x = sum(mid);
if(x >= val) hi = mid - ;
else lo = mid + ;
}
return lo;
} void solve() {
for(int i = ; i <= n; i++) {
int pos = lb(a[i]+);
update(pos, -);
b[pos-] = i;
}
for(int i = ; i <= n; i++) {
printf("%d ", b[i]);
}
printf("\n");
} int main() {
// freopen("in", "r", stdin);
while(~scanf("%d", &n)) {
init();
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
solve();
}
return ;
}
[YY]已知逆序列求原序列(二分,树状数组)的更多相关文章
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- 计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组
题目链接:https://nanti.jisuanke.com/t/16443 题意: 给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数. 数据范围: 对 ...
- UvaLive 6667 Longest Chain (分治求三元组LIS&树状数组)
题目链接: here 题意: 和hdu4742类似.差别就是一部分三元组是直接给出的.另一部分是用他给的那个函数生成的.还有就是这里的大于是严格的大于a>b必须ax>bx,ay>by ...
- BZOJ5058 期望逆序对 【矩乘 + 组合数学 + 树状数组】
题目链接 BZOJ5058 题解 可以发现任意两个位置\(A,B\)最终位置关系的概率是相等的 如果数列是这样: CCCCACCCCBCCCC 那么最终有\(7\)种位置关系 \((A,B)\) \( ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- hdu 4911 求逆序对数+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...
- BZOJ3787:Gty的文艺妹子序列(分块,树状数组)
Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...
- hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...
- POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...
随机推荐
- 源码安装apache
目标:源码安装apache 依赖包:apr.apr-util和pcre.其中pcre正则库要先安装,apr和apr-util(已解压)可以复制到apache下的资源库srclib下. 安装pcre: ...
- iOS原生JSON解析.
- (IBAction)accessInterfaceBtnPressed:(id)sender { NSError *error; NSString *URL=@"ht ...
- ServiceStack.Redis常用操作 - 事务、并发锁_转
一.事务 使用IRedisClient执行事务示例: using (IRedisClient RClient = prcm.GetClient()) { RClient.Add("key&q ...
- 多拉A梦——日语歌词
こんなこといいな できたらいいな 这件事真好啊 能够做到的话就好啦 あんな梦(ゆめ) こんな梦(ゆめ) いっぱいあるけど 那样的梦想 这样的梦想 我还有好多哪 みんなみんなみんな かなえてくれる 大家 ...
- ecshop编辑器fckeditor换百度ueditor编辑器教程
1.下载uediter编辑器,解压上传目录uediter到根目录/includes/下 2.修改admin/includes/lib_main.php /** * 生成编辑器 ...
- 微信利用PHP创建自定义菜单的方法
在使用通用接口前,你需要做以下两步工作:1.拥有一个微信公众账号,并获取到appid和appsecret(在公众平台申请内测资格,审核通过后可获得)2.通过获取凭证接口获取到access_token注 ...
- ACM题目————棋盘问题
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- hdu 1016 Prime Ring Problem(深度优先搜索)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- mini.open打开窗口时传递参数
mini.open({ url: "xxx.html", showMaxButton: false, allowResize: false, title: '标题', width: ...
- jqeury之平移轮播
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...