【poj2182】【poj2828】树状数组/线段树经典模型:逆序查找-空位插入法
poj2182题意:有一个1~n的排列,现在给定每个人前面有多少个人的编号比他大,求这个排列是什么。n<=8000
poj2182题解:
逆序做,可以确定二分最后一个是什么,然后删除这个数。树状数组维护每个数前面有多少个数比它小。
poj2828题意:有 n 个人排队买票,他们依次到来,第 i 个人来的时候会站在第pos[i]个人后面,并且他的编号为v[i]。
求最后的队列中每个位置人的编号。
poj2828题解:
来一个例子模拟:
0 (3) //编号为3的人插入第0个人后面
1 (2)
1 (1)
0 (4)
假设已经知道了最后的答案:
(4)(3)(1)(2)
类比上一题,我们可以逆序做,然后对于当前的最后一个人,它前面一定有且只有pos[i]个空位,就转化为上一题了。一但确定了一个人,那个空位就被填了,在树状数组上更新一下。
//poj2182
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std; const int N=;
int n,a[N],c[N],ans[N]; void add(int x,int d)
{
for(int i=x;i<=n;i+=(i&(-i))) c[i]+=d;
}
int getsum(int x)
{
int ans=;
for(int i=x;i>=;i-=(i&(-i))) ans+=c[i];
return ans;
} int main()
{
freopen("a.in","r",stdin);
scanf("%d",&n);
memset(c,,sizeof(c));
for(int i=;i<=n;i++) add(i,);
a[]=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
int l,r,mid;
for(int i=n;i>=;i--)
{
l=,r=n;
while(l<r)
{
mid=(l+r+)/;
if(getsum(mid-)>a[i]) r=mid-;
else l=mid;
}
ans[i]=l;
add(l,-);
}
for(int i=;i<=n;i++) printf("%d\n",ans[i]);
return ;
}
poj2182
//poj2828
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std; const int N=;
int n,a[N],val[N],c[N],ans[N]; void add(int x,int d)
{
for(int i=x;i<=n;i+=(i&(-i))) c[i]+=d;
}
int getsum(int x)
{
int ans=;
for(int i=x;i>=;i-=(i&(-i))) ans+=c[i];
return ans;
} int main()
{
freopen("a.in","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(c,,sizeof(c));
for(int i=;i<=n;i++) add(i,);
for(int i=;i<=n;i++) scanf("%d%d",&a[i],&val[i]);
int l,r,mid;
for(int i=n;i>=;i--)
{
l=,r=n;
while(l<r)
{
mid=(l+r+)/;
if(getsum(mid-)>a[i]) r=mid-;
else l=mid;
}
ans[l]=i;
add(l,-);
}
for(int i=;i<=n;i++) printf("%d ",val[ans[i]]);printf("\n");
} return ;
}
poj2828
【poj2182】【poj2828】树状数组/线段树经典模型:逆序查找-空位插入法的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
		
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
 - 树状数组 && 线段树应用 -- 求逆序数
		
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
 - hdu1394(枚举/树状数组/线段树单点更新&区间求和)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
 - hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
		
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
 - hdu 5147 Sequence II【树状数组/线段树】
		
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
 - 数据结构--树状数组&&线段树--基本操作
		
随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...
 - BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))
		
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...
 - BZOJ 3333 排队计划 树状数组+线段树
		
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
 - 第十四个目标(dp + 树状数组 + 线段树)
		
Problem 2236 第十四个目标 Accept: 17 Submit: 35 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
 
随机推荐
- Android 开发 之 JNI入门 - NDK从入门到精通
			
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...
 - 2019寒假训练营寒假作业(三) MOOC的网络空间安全概论笔记部分
			
目录 第五章 网络攻防技术 5.1:网络信息收集技术--网络踩点 信息收集的必要性及内容 网络信息收集技术 网络踩点(Footprinting) 网络踩点常用手段 5.2:网络信息收集技术 --网络扫 ...
 - C++ Mooc学习
			
# C++远征篇之起航 1.IDE搭建,现在大部分同学都使用devC,devC的debug调试功能特别好用,可以跟踪变量.省去了在中间插入一些输出语句来输出中间变量的麻烦. 2.using names ...
 - Qt-excel文件操作方法
			
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt-excel文件操作方法 本文地址:http://techieliang.com/ ...
 - Httpd主配置文件httpd.conf 详解
			
Apache的主配置文件:/etc/httpd/conf/httpd.conf默认站点主目录:/var/www/html/Apache服务器的配置信息全部存储在主配置文件/etc/httpd/conf ...
 - 【Docker 命令】 - search 命令
			
docker search : 从Docker Hub查找镜像 语法 docker search [OPTIONS] TERM OPTIONS说明: --automated :只列出 automate ...
 - array to object
			
array to object native js & ES6 https://stackoverflow.com/questions/4215737/convert-array-to-obj ...
 - JAVA的泛型与反射的联合应用
			
通过泛型与反射的结合,可以编写框架来使开发更容易,这里演示的是BaseDao部分的简单使用. BaseDao部分代码: public abstract class BaseDao<T>{ ...
 - bzoj1086-王室联邦
			
题目 给出一棵树,求一种分块方案,使得每个块的大小\(size\in [B,3B]\).每个块还要选一个省会,省会可以在块外,但是省会到块内任何一个点路径上的所有除了省会的点都必须属于这个块.\(n\ ...
 - CF#67 75d Big Maximum Sum
			
~~~题面~~~ 题解: 观察到拼接后的数据范围过大,无法O(n)解决,但是大区间是由很多小区间组成,而小区间是固定的,不会变化,所以可以考虑预处理出每个小区间的信息,然后根据给定序列按顺序一步一步合 ...