SPOJ - ORDERS--- Ordering the Soldiers---根据逆序对求原数组
题目链接:
https://vjudge.net/problem/SPOJ-ORDERS
题目大意:
根据每个数字的逆序对求出原数组
解题思路:
举个例子:
n = 5
a[ n ] = { 0, 1, 2, 0, 1 };
对于第5个士兵,s[ 5 ] = { 1, 2, 3, 4, 5 };
而与它对应的a[ 4 ] = 1,也就是说在他左边的士兵里,有1个比他小,他在他左边的士兵里排第四,故s[5]里第四小的排名就是他的,对应4
对于第4个士兵,s[ 4 ] = { 1, 2, 3, 5 };没有4表示第四小的排名已经被占
a[ 3 ] = 0, 也就是说他左边的士兵都比他等级高,他的排名就最大,故s[4]里最大的事5,就是他的排名
对于第3个士兵,s[ 3 ] = { 1, 2, 3 };
a[ 2 ] = 2, 表示第 3 个士兵左边的两个士兵等级都比他低,故取s[3]里最小的--1
对于第2个士兵,s[ 2 ] = { 2, 3 };
a[ 1 ] = 1, 表示第 2 个士兵左边的一个士兵等级比他低,故取s[2]里最小的--2
对于第1个士兵,s[ 1 ] = { 3 };
显然第一个士兵排名为3
故解题步骤为:
将1,2,3,...,n添加到集合s里
倒着处理每个士兵:
1.找到s里第a[i]大的数k,赋值给r[i],为i士兵的排名
2.将s里的k剔除
#include<bits/stdc++.h>
#define lowbit(i) (i & (-i))
using namespace std;
const int maxn = ;
int a[maxn];
int tree[maxn], n;
int ans[maxn];
void add(int x, int d)
{
while(x <= n)
tree[x] += d, x += lowbit(x);
}
int sum(int x)
{
int ans = ;
while(x)
ans += tree[x], x -= lowbit(x);
return ans;
}
int Find(int x)
{
int l = , r = n;
while(l < r)
{
int mid = (l + r) / ;
if(sum(mid) >= x)
r = mid;
else l = mid + ;
}
return r;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
memset(tree, , sizeof(tree));
scanf("%d", &n);
for(int i = ; i <= n; i++)add(i, ), scanf("%d", &a[i]);
for(int i = n; i >= ; i--)
ans[i] = Find(i - a[i]), add(ans[i], -);
printf("%d", ans[]);
for(int i = ; i <= n; i++)
printf(" %d", ans[i]);
puts("");
}
return ;
}
SPOJ - ORDERS--- Ordering the Soldiers---根据逆序对求原数组的更多相关文章
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- Bzoj 2141: 排队 分块,逆序对,树状数组
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1310 Solved: 517[Submit][Status][Discuss] D ...
- 求逆序对[树状数组] jdoj
求逆序对 题目大意:给你一个序列,求逆序对个数. 注释:n<=$10^5$. 此题显然可以跑暴力.想枚举1到n,再求在i的后缀中有多少比i小的,统计答案即可.这显然是$n^2$的.这...显然过 ...
- 洛谷 P1908 逆序对(树状数组解法)
归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...
- 逆序对&求逆序对
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- luogu1908 逆序对 树状数组
题目大意:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对.求一段序列的逆序对数. 对于一个数组T,其一个点的值为值与该点下标相等的A序列中点的个数.对T维护一个树状数 ...
- 【a703】求逆序对(树状数组的解法)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 给定一个序列a1,a2...an.如果存在i小于j 并且ai大于aj,那么我们称之为逆序对,求给定序列中逆序 ...
- luogu P1908 逆序对 |树状数组
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的 ...
- P1908 逆序对——树状数组&离散化&快读快写の学习
题目简述: 对于给定的一段正整数序列,逆序对就是序列中 a_i>a_jai>aj 且 i<ji<j 的有序对. 输出序列中逆序对的数目. 知识补充: 树状数组: 这东西就是 ...
随机推荐
- word页眉添加横线与删除横线
一.删除横线 1.打开已有页眉Word2010文档,并且页眉有横线的,双击页眉 2.选中整个页眉段落,注意:一定要选择段落标记. 3.单击菜单“开始”功能模块. 4.在“段落”中单击边框线下三角按钮. ...
- Python模块:operator简单介绍
Python官方文档地址:https://docs.python.org/3.6/library/operator.html?highlight=operator Operator提供的函可用于对象比 ...
- 企业生产环境不同业务linux系统分区方案
转自:http://edu.51cto.com/lession/id-11842.html
- from表单,图片预览,和表单提交
<form> <input id="file" class="topsub-file" type="file" name= ...
- spring和springmvc父子容器关系
一般来说,我们在整合spring和SpringMVC这两个框架中,web.xml会这样写到: <!-- 加载spring容器 --> <!-- 初始化加载application.xm ...
- (转)blkid命令 获取文件系统类型、UUID
blkid命令 获取文件系统类型.UUID 原文:http://www.cnblogs.com/dkblog/archive/2011/08/30/2159630.html 在Linux下可以使用b ...
- netty之==TCP粘包/拆包问题解决之道(一)
一.TCP粘包/拆包是什么 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在 ...
- GOPS 2018全球运维大会上海站 参会感悟梳理
今天遇到很多优秀的讲师.业界的大伽,很开心 现在把get到的信息梳理一下:(1)想解决性能问题,一定要在缓存上下功夫:[nginx上有好多文章可以做,真是博大精深呢<深入理解Nginx:模块开发 ...
- Xtrareport 多栏报表
首先看下布局designer 细节: 分组一定要用到GroupHeather 设置好有 右边会出现 接下来是代码部分 Form1中代码 using DevExpress.XtraReports.UI; ...
- iOS 时间戳和时间互换,计算两日期相隔天数
/* *获取当前系统时间的时间戳 */ +(NSInteger)getNowTimestamp; /** * 获取当前时间 */ + (NSString *)getNowTimeTampF ...