浅谈线段树和树状数组: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\n",ans[i]);//倒着确定正着输出
return 0;
}

POJ2182:Lost Cows的更多相关文章

  1. 【POJ2182】Lost Cows

    [POJ2182]Lost Cows 题面 vjudge 题解 从后往前做 每扫到一个点\(i\)以及比前面小的有\(a[i]\)个数 就是查询当前的第\(a[i]+1\)小 然后查询完将这个数删掉 ...

  2. POJ:2456-Aggressive cows

    Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18313 Accepted: 8716 Desc ...

  3. POJ 2182&& POJ 2828:Lost Cows 从后往前 线段树

    Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10544   Accepted: 6754 Descri ...

  4. POJ 2186:Popular Cows Tarjan模板题

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25945   Accepted: 10612 De ...

  5. 【POJ2182】Lost Cows 树状数组+二分

    题中给出了第 i 头牛前面有多少比它矮,如果正着分析比较难找到规律.因此,采用倒着分析的方法(最后一头牛的rank可以直接得出),对于第 i 头牛来说,它的rank值为没有被占用的rank集合中的第A ...

  6. POJ 2456: Aggressive cows(二分,贪心)

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20485   Accepted: 9719 ...

  7. POJ3621:Sightseeing Cows——题解

    http://poj.org/problem?id=3621 全文翻译参自洛谷:https://www.luogu.org/problemnew/show/P2868 题目大意:一个有向图,每个点都有 ...

  8. 图论:POJ2186-Popular Cows (求强连通分量)

    Popular Cows Description Every cow's dream is to become the most popular cow in the herd. In a herd ...

  9. POJ 3621:Sightseeing Cows(最优比率环)

    http://poj.org/problem?id=3621 题意:有n个点m条有向边,每个点有一个点权val[i],边有边权w(i, j).找一个环使得Σ(val) / Σ(w)最大,并输出. 思路 ...

随机推荐

  1. java 获取微信 页面授权 获取用户openid

    先调用微信的地址 跳转https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4b4009c4fce00e0c&redirect ...

  2. rtems 4.11 启动流程(arm, beagle)

    请参照官方的 bsp_howto 文档,对arm来说,首先执行的文件是start.S start.S c/src/lib/libbsp/arm/shared/start/start.S 1.从 _st ...

  3. 【Python基础】之不同的文件在不同目录下导入指定模块的方法

    如下图三个文件的目录路径 – project     |–  1     |    |–  2     |    |    |–  3    |    |    |    |– owen.py     ...

  4. 跟着实例学习设计模式(6)-生成器模式builder(创建型)

    生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...

  5. hunnu--11548--找啊找啊找朋友

    找啊找啊找朋友 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 14,  ...

  6. java 多参实现

    package com.northeasttycoon.monitor.service; import static java.lang.System.out; /** * Created by no ...

  7. IOS开发之----异常处理

    本文转载至 http://blog.csdn.net/chenyong05314/article/details/7906593 转载自:http://blog.sina.com.cn/s/blog_ ...

  8. TCP交换数据流——Nagle算法简单记录

    Nagle算法: 该算法提出的目的是想解决网络中大量的小的TCP数据包造成网络拥塞的问题,举个例子,当客户端要发送一个字节的TCP数据包到服务器时,我们实际上产生了41字节长的分组:包括20字节的IP ...

  9. EasyDSS RTMP流媒体解决方案之Windows服务安装方案

    Windows服务安装 EasyDSS_Solution流媒体解决方案,可以通过start一键启动.在实际应用中,我们希望可以设置成系统服务,那么下面我将会介绍,如何在windows中将流媒体解决方案 ...

  10. 设计模式系列一创建型模式之(简单工厂VS工厂方法)

    1.简单工厂简介 诞生背景:在我们平常编程当中,经常会使用new进行实例化一个对象,此时该类完全依赖于该对象,专业术语来说就是耦合度高.当需求发生变化时我们不得不去修改此类的源码,造成整个系统难以维护 ...