zoukankan      html  css  js  c++  java
  • POJ2182:Lost Cows

    浅谈线段树和树状数组:https://www.cnblogs.com/AKMer/p/9946944.html

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

    线段树,倒着确定每一个数字。因为最后一个是唯一的,得知最后一个是什么之后倒数第二个就是唯一的了。每次询问[(1,n)]中还没有出现的数字第(k)大,直接在线段树上找。如果左儿子里可以用的数字个数大于(k),那么就去左儿子里面找,否则就去右儿子里找第(k)-左儿子可用数字个数大的数。

    时间复杂度:(O(nlogn))

    空间复杂度:(O(n))

    代码如下:

    #include <cstdio>
    using namespace std;
    
    const int maxn=8005;
    
    int n;
    int a[maxn],ans[maxn];
    
    int read() {
    	int x=0,f=1;char ch=getchar();
    	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    	for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    	return x*f;
    }
    
    struct segment_tree {
    	int tree[maxn<<2];
    
    	void updata(int p) {
    		tree[p]=tree[p<<1]+tree[p<<1|1];
    	}
    	
    	void build(int p,int l,int r) {
    		if(l==r) {tree[p]=1;return;}//初始每个数字都能用
    		int mid=(l+r)>>1;
    		build(p<<1,l,mid);build(p<<1|1,mid+1,r);
    		updata(p);
    	}
    	
    	int query(int p,int l,int r,int rk) {
    		if(l==r) {
    			tree[p]=0;
    			return l;//我把query和change写一起了。
    		}
    		int mid=(l+r)>>1,res;
    		if(tree[p<<1]>=rk)res=query(p<<1,l,mid,rk);
    		else res=query(p<<1|1,mid+1,r,rk-tree[p<<1]);
    		updata(p);return res;
    	}
    }T;
    
    int main() {
    	n=read();T.build(1,1,n);
    	for(int i=2;i<=n;i++)
    		a[i]=read();
    	for(int i=n;i;i--)
    		ans[i]=T.query(1,1,n,a[i]+1);
    	for(int i=1;i<=n;i++)
    		printf("%d
    ",ans[i]);//倒着确定正着输出
    	return 0;
    }
    
  • 相关阅读:
    GridView动态创建TemplateField的回发问题
    ASP.NET页面生命周期
    php图片叠加
    php文件下载
    mysql 常用操作命令
    转载:图解SQL的Join
    利用iframe来做无刷新上传
    php抽象和接口的区别
    php 循环打开目录读取文件
    mysql存储引擎的对比(一)
  • 原文地址:https://www.cnblogs.com/AKMer/p/9949020.html
Copyright © 2011-2022 走看看