poj2182Lost Cows——树状数组快速查找

题目:http://poj.org/problem?id=2182

从后往前确定,自己位置之前没有被确定的且比自己编号小的个数+1即为自己的编号;

利用树状数组快速查找,可另外开一个b数组,角标为编号大小,而其值为是否使用,二分查找到恰好满足条件的位置,向后一直找到没被用过的第一个编号即为此位置编号。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[8005],f[8005],ans[8005];
bool b[8005];
int query(int x)
{
	int sum=0;
	for(;x;x-=x&-x)
		sum+=f[x];
	return sum;
}
void add(int x,int y)
{
	for(;x<=n;x+=(x&-x))
		f[x]+=y;
}
int main()
{
	scanf("%d",&n);
	f[1]=1;//!
	for(int i=2;i<=n;i++)
	{
		scanf("%d",&a[i]);
		f[i]=i&-i;
	}
	for(int i=n;i>=1;i--)
	{
		int l=1,r=n;
		while(l<=r)
		{
			int mid=(l+r)/2;
			int k=query(mid-1);
			if(a[i]>k)l=mid+1;
			if(a[i]<k)r=mid-1;
			if(a[i]==k)
			{
				while(b[mid])mid++;
				ans[i]=mid;
				b[mid]=1;
				add(mid,-1);
				break;
			}
		}
	}
	for(int i=1;i<=n;i++)
		printf("%d\n",ans[i]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/Zinn/p/8440018.html

时间: 2024-07-31 04:51:53

poj2182Lost Cows——树状数组快速查找的相关文章

POJ 2182 Lost Cows (树状数组 &amp;&amp; 二分查找)

题意:给出数n, 代表有多少头牛, 这些牛的编号为1~n, 再给出含有n-1个数的序列, 每个序列的数 ai 代表前面还有多少头比 ai 编号要小的牛, 叫你根据上述信息还原出原始的牛的编号序列 分析:如果倒着看这个序列的话, 那序列的最后一个元素就能够确定一个编号.举个例子:如果序列的最后一个元素为0, 那就说明这头牛前面再也没有比它编号更小的牛了, 所以这头牛的编号肯定是最大的, 我们只要给它所在的编号加个标记, 然后继续根据倒数第二个.第三个--来依次确定便可还原整个序列, 这里可以使用树

POJ 2481 Cows(树状数组)

Description Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good. Farmer John has N cows (we number the cows from 1 to N). Ea

POJ2481 Cows 树状数组的简单应用

题意给了你N头牛,每头牛的强壮值是一个区间[s,e],如果第 i 头牛比第 j 头牛强壮那么必须满足 Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj: 为了满足这三个条件我们进行排序,先以e降序排为先决条件,若e相等则让s升序排列,如此即可满足三个条件,这道题目任意两头牛的强壮值区间有可能完全一样,这样就不需要重新用树状数组求一次和了,直接赋值即可,这样可以省很多时间,因为已经排序处理了,所以即便区间相等的  肯定就是相邻的,所以直接扫一遍即可,若

Cows(树状数组)

Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 19673   Accepted: 6699 Description Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in hi

POJ2481:Cows(树状数组)

Description Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good. Farmer John has N cows (we number the cows from 1 to N). Ea

POJ 2182 Lost Cows (树状数组)

Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9660   Accepted: 6219 Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood 'waterin

poj 2481 Cows 树状数组解法,详细解析。

Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13445   Accepted: 4448 Description Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in hi

soj 1088. Cows(树状数组)

可以用树状数组解决. 先按左端点递增排序,左端点相等的按右端点降序排列. 然后从左往有扫,更新答案同时更新sum数组. 对于一只Cow i,ans[i]为f(i)-g(i). f(i)为满足p[j].s<=p[i].s&&p[j].e>=p[i].e(0<=j<n,j!=i)的Cow只数. g(i)为满足p[j].s==p[i].s&&p[j].e==p[i].e(0<=j<n,j!=i)的Cow只数. 开个d数组维护一下,d[i]即为g

POJ 2481 COWS(树状数组)

题目大意: 说给你n个线段的,告诉你每个线段的起始点S_i,和终止点E_i, 问这n条线段里有多少线段是相互包含的,如果两个端点重合不算包含. 解题思路: 用树状数组搞就可以了,这道题是star的变形题,star是让我们求出有多个星星在这个星星的左下角,而这道题是让我们求出有多少个星星在这个星星的左上角. 这样分析,对于(S_i,E_i)我们把他封装成为一个点的坐标,那么(S_j,E_j)同样也可以被封装成为一个点的坐标,而题目中说的S_i<S_j&&E_j<E_i&&