CodeChef:ORDERS

简化题意:

\(n\) 个人排队,给定每个人需要向左移动几个,求最终排列。

即还原逆序对。

错误想法

既然知道每个人向左移动 \(a_i\) 个,那就相当于让他的排名 \(-a_i\),他前面 \(a_i\) 个人的排名 \(+1\),差分即可。

问题在于他前面的 \(a_i\) 应是前面的人排好后的后 \(a_i\) 个,直接差分则是原序列中的。

sol

考虑倒着做。最后一个人的排名显然是 \(n-a_n\),则第 \(n-1\) 个人则是剩余排名中第 \(n-1-a_{n-1}\) 小的,以此类推。

正确性:分两类:第 \(n\) 个人是否对第 \(n-1\) 个人有影响易证。

code
const int N = 2e6+5;
int T,n; int a[N],b[N]; #define lb(x) (x&-x)
struct BIT {
int t[N],n,l;
void add(int i,int x){for(;i<=n;i+=lb(i))t[i]+=x;}
int kth(int k) { // 权值BIT求第k大
int res = 0;
for(int i = l; ~i; --i) {
res += 1<<i;
if( res > n || k-t[res] <= 0 ) res -= 1<<i;
else k -= t[res];
}
return res+1;
}
} bit;
#undef lb int main() {
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
read(T);
while( T-- ) {
read(n);
bit.n = n;
for(bit.l = 1; (1<<bit.l+1) <= n; ++bit.l);
For(i,1,n) read(a[i]), bit.add(i,1);
for(int i = n; i; --i) {
b[i] = bit.kth(i-a[i]);
bit.add(b[i],-1);
}
For(i,1,n) printf("%d ",b[i]);
putchar(10);
}
return 0;
}

Ordering the Soldiers 题解的更多相关文章

  1. spoj-ORDERS - Ordering the Soldiers

    ORDERS - Ordering the Soldiers As you are probably well aware, in Byteland it is always the military ...

  2. SPOJ 227 Ordering the Soldiers

    As you are probably well aware, in Byteland it is always the military officer's main worry to order ...

  3. SPOJ 227 Ordering the Soldiers 线段树 / 树状数组

    题意:设原数组为a[i],pos[i]代表第 i 个位置之前有多少个数比a[i]大,求原数组a[i]. 这个题意是看了别人的题解才明白,我自己没读出来…… 方法:假设我们从左往右放,因为后面的数还有可 ...

  4. 树状数组求第K小值 (spoj227 Ordering the Soldiers &amp;&amp; hdu2852 KiKi&#39;s K-Number)

    题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...

  5. 2017 google Round C APAC Test 题解

    题解参考网上的答案,以及我自己的想法. 主要参考网站:http://codeforces.com/blog/entry/47181,http://codeforces.com/blog/entry/4 ...

  6. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  7. Ordering Tasks(拓扑排序+dfs)

    Ordering Tasks John has n tasks to do. Unfortunately, the tasks are not independent and the executio ...

  8. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...

  9. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

随机推荐

  1. Mac卸载软件真不省心啊

    最近看看磁盘觉得有点小, 就整理了一下, 经过一番折腾, 发现MacOS卸载软件可真是不省心啊. 从应用里移到垃圾桶仅仅是第一步, 当然对于不读写任何文件的应用也许就可以了. 咱们看看赶紧卸载一个软件 ...

  2. Jmeter分布式压测实战及踩坑处理(含参数化)

    项目中使用Jmeter进行大并发压测时,单机受限内存.CPU.网络IO,会出现服务器压力还没有上 去,但压测服务器由于模拟的压力太大死机的情况.JMeter的集群模式可以让我们将多台机器联合起来 一起 ...

  3. vue的table切换

    HTML: <div id="box"> <ul> <li v-for="(item,index) in items" v-tex ...

  4. cs派生msf shell

    msf5 > use exploit/multi/handler [*] Using configured payload windows/meterpreter/reverse_http ms ...

  5. 关于TreeSet集合的理解

    TreeSet 集合主要是实现了Collection集合的实现类,主要框架为: 1. Set接口的框架: |----Collection接口:单例集合,用来存储一个一个的对象 |----Set接口: ...

  6. 深入理解SPI机制

    一.什么是SPI SPI ,全称为 Service Provider Interface,是一种服务发现机制.它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加 ...

  7. Java之Listener

    Java之Listener Listener监听器 监听器有很多种,大部分还是在GUI用的比较多,这里简单记录一点关于HttpSessionListener的 统计session count List ...

  8. Kerberos认证流程简述

    摸鱼了很长一段时间,被大佬按在地上摩擦,一时间精神恍惚想不起来写点啥,正好回来碰巧给别人讲kerberos协议认证流程,结果讲来讲去把自己讲晕了,就非常尴尬 于是有了这篇文章(友情提示:无事莫装X,装 ...

  9. mysql--使用shardingsphere实现分表

    一. 简介 为什么要分表,无非就两个原因,要么是并发太高,要么就是数据量太大. 所谓分表就是把传统的单表扩展为多个数据结构一样的表,通过分表策略确定操作哪一张表. 我使用的分表规则是通过主键id进行取 ...

  10. bootstrap.yaml和application.yaml的区别

    bootstrap.yaml 配置一些引导系统启动的参数,这些参数一旦指定后就不会变动了.比如程序的端口号,配置中心的地址等. application.yaml 应用级别的参数配置,可能会根据业务需求 ...