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 的有序对. 输出序列中逆序对的数目. 知识补充: 树状数组: 这东西就是 ...
随机推荐
- 需要了解的几个Java基础点
关键字 native:表示要调用非Java语言写函数,比如用C语言使用JNI实现的接口.比如windows环境的dll文件.举例:Object.hashcode() 位运算 << n:左移 ...
- InterruptionInJava
package com.test; public class InterruptionInJava implements Runnable{ public static void main(Strin ...
- java中使用nextLine(); 没有输入就自动跳过的问题?
[问题分析] 必要的知识:in.nextLine();不能放在in.nextInt();代码段后面否则in.nextLine();会读入"\n"字符,但"\n" ...
- 如何利用fastjson将JSON格式的字符串转换为Map,再返回至前端成为js对象
//注意,这里的jsonStr是json格式的字符串,里面如果遇到双引号嵌套双引号的,一般是嵌套的双引号经过转义 // \",假如有这样的一个场景,这些字符串里面有需要的css样式的j ...
- 使用ServletContainerInitializer动态注册组件
1.背景 在web容器(例如tomcat)启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等.对此servlet规范提供了ServletContainerInit ...
- oracle命令查看表结构及表索引
--查看oracle数据库的单个表结构 select dbms_metadata.get_ddl('TABLE','TABLE_NAME') from dual; 括号里面有两个参数,第一个参数是我们 ...
- Android NDK开发 图片处理(五)
做过Java的同学可能经常会遇到一些关于图片处理的 例如类似QQ离线头像显示灰的.最快的算法是用colorMatrix来实现.这里通过Java调用JNI来处理每一个像素来实现. 对每一个像素点取出RG ...
- python 下载图片
import requests from PIL import Image from io import BytesIO url = 'http://image2.buslive.cn/shp/upl ...
- Spark集群安装MySQL环境
1.修改yum源 鉴于用国外的Yum源,速度比较慢,所以想到将国外的yum源改为国内的Yum源,这里选择使用比较多的阿里云源.具体修改方法可以参考此连接 我们先新建一个新的文件用来存放Yum源: [k ...
- (七)使用jedis连接单机和集群(一步一个坑踩出来的辛酸泪)
环境准备: redis-4.0.9,最新版了 ruby:redis-x.x.x.gem 这个gem什么版本都行,我redis4用3.0.0的gem正常跑 jedis-2.9.0.jar,最新版 ...