HDU 5592 ZYB's Game 【树状数组】+【二分】
<题目链接>
题目大意:
给你一个由1~n,n个数组成的序列,给出他们每个的前缀逆序数,现在要求输出这个序列。
解题分析:
由前缀逆序数很容易能够得到每个数的逆序数。假设当前数是i,它前面比它小的数为a[i]( i - 1 - i的逆序数即可),我们不难知道,i在前i个数中是第i+1大的。然后我们从后往前考虑,每次都能确定一个位置的数的大小,根据当前位置i的数在 1~i 的数的大小,我们用二分查找快速聪当前还未分配的数中给它分配相应大小的数值,然后将这个数值从可分配的数中剔除,防止对前面的数造成影响(相当于每次只考虑i前面的数,i后面的数都已经确定好了数值)。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e4+;
int n;
int a[N],tr[N],ans[N];
inline int lowbit(int x){return x&(-x);}
void add(int x,int val){
for(int i=x;i<=N;i+=lowbit(i))
tr[i]+=val;
}
int sum(int x){
int ans=;
for(int i=x;i>;i-=lowbit(i))
ans+=tr[i];
return ans;
}
int Binary(int k){
int lt = , rt = n, mid, t;
while (lt+ < rt){
mid = (lt+rt)>>;
t = sum(mid);
if (t >= k) rt = mid;
else lt = mid;
}
if (sum(lt) == k) return lt;
else return rt;
}
void solve(){
for(int i=;i<=n;i++)add(i,);
for(int i=n;i>;i--){ //从后往前,逐渐分配可供选择的数
ans[i]=Binary(a[i]+); //在当前可供选择的数中,挑选第a[i]+1大的数
add(ans[i],-); //因为是根据第i个数是前i个数中第a[i]+1大的来确定位置的,所以要消除i后面的所有元素的影响
}
for(int i=;i<=n;i++)
printf("%d%s",ans[i],i==n?"\n":" ");
}
int main(){
int T;scanf("%d",&T);while(T--){
scanf("%d",&n);
int pre=, now;
for(int i=;i<=n;i++){
scanf("%d",&now);
a[i]=i--(now-pre);
pre=now;
}
memset(tr,,sizeof(tr));
solve();
}
}
2018-12-15
HDU 5592 ZYB's Game 【树状数组】+【二分】的更多相关文章
- HDU 5592 ZYB's Premutation(树状数组+二分)
题意:给一个排列的每个前缀区间的逆序对数,让还原 原序列. 思路:考虑逆序对的意思,对于k = f[i] - f[i -1],就表示在第i个位置前面有k个比当前位置大的数,那么也就是:除了i后面的数字 ...
- hdu 5592 ZYB's Game 树状数组
ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=55 ...
- HDU 2852 KiKi's K-Number 树状数组 + 二分
一共最多才100000个数,并且数值范围0~100000. 树状数组 C[i] 记录数值为 i 的数有多少个. 删除时如果Query( a ) - Query( a - 1 ) == 0 则该数不存在 ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 2852 KiKi's K-Number 树状数组
先补充从n个数中求第k小数的理论知识........ 睡觉去~ ------------------------------------------又要睡觉的分割线------------------ ...
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...
- TZOJ 4602 高桥和低桥(二分或树状数组+二分)
描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...
- POJ 2182 Lost Cows 【树状数组+二分】
题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- 树状数组+二分||线段树 HDOJ 5493 Queue
题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], ...
随机推荐
- python1114string_test
#! -*- coding:utf-8 -*- str = "self_learn"print(type(str))str.title()print(str.title()) # ...
- 基础常用的数据结构 Collection Map
map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map ...
- java 实现往oracle存储过程中传递array数组类型的参数
注:本文来源于 < java 实现往oracle存储过程中传递array数组类型的参数 >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...
- 《剑指offer》 反转链表
本题来自<剑指offer> 反转链表 题目: 输入一个链表,反转链表后,输出新链表的表头. 思路: 需要三个变量,来保存当前节点的,前面节点和反转后的节点. C++ Code: /* st ...
- laravel 里面结合关联查询 的when()用法
Laravel 5.6 里面的when用法: $name = $request->get('name'); //活动标题 $start_time = $request->get('star ...
- MySQL5.7.20报错Access denied for user 'root'@'localhost' (using password: NO)
在centos6.8上源码安装了MySQL5.7.20,进入mysql的时候报错如下: 解决办法如下: 在mysql的配置文件内加入: vim /etc/my.cnf skip-grant-tabl ...
- 饮冰三年-人工智能-Python-10之C#与Python的对比
1:注释 C# 中 单行注释:// 多行注释:/**/ python 中 单行注释:# 多行注释:“““内容””” 2:字符串 C#中 "" 用双引号如("我是字符串&q ...
- 没有系列化导致错误:java.io.NotSerializableException: com.bjpowernode.bean.Team
java.io.NotSerializableException: com.bjpowernode.bean.Team Cause: java.io.NotSerializableException: ...
- Sublime Text 3 快捷键总结(拿走)
以下是个人总结不完全的快捷键总汇,祝愿各位顺利解放自己的鼠标. 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同 ...
- Python模拟人猜数过程(折半查找)
import random# (0,1000)随机产生一个数key = random.randint(1,1000)# 用来统计猜的次数count = 0 # 定义一个折半查找的函数def BinSe ...