题目链接

戳这

题目大意

\(N(2 <= N <= 8,000)\)头奶牛有\(1..N\)范围内的独特品牌.对于每头排队的牛,知道排在那头牛之前的并比那头牛的品牌小的奶牛数目.根据这些数据,输出的确切排序。

题解

令输入数组为b[i];

可以发现最后一个奶牛可以确定为b[n]+1,由最后一个又可以推出倒数第二个,由此递推就好了,每次的答案就是序列中的第b[i]+1小的数,询问完后就将这个数从序列中删除。

至于怎么选那个数,就看你用什么数据结构维护了,我用的平衡树。

code

#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9')
x=x*10+c-'0',c=getchar();
return x*f;
}
int cnt,root;
struct node{
int fa,ch[2],v,size,son;
}a[500001];
void pushup(int k){
a[k].son=a[a[k].ch[0]].son+a[a[k].ch[1]].son+a[k].size;
}
void turn(int x){
int y=a[x].fa,z=a[y].fa;
int k=x==a[y].ch[1],k2=y==a[z].ch[1];
a[z].ch[k2]=x,a[x].fa=z;
a[y].ch[k]=a[x].ch[k^1],a[a[x].ch[k^1]].fa=y;
a[x].ch[k^1]=y,a[y].fa=x;
pushup(y),pushup(x);
}
void splay(int x,int u){
while(a[x].fa!=u){
int y=a[x].fa,z=a[y].fa;
if(z!=u)
(a[y].ch[0]==x)^(a[z].ch[0]==y)?turn(x):turn(y);
turn(x);
}
if(u==0)
root=x;
}
void add(int x){
int u=root,f=0;
while(u&&a[u].v!=x)
f=u,u=a[u].ch[x>a[u].v];
if(u)
a[u].size++;
else{
++cnt;
u=cnt;
if(f)
(x>a[f].v)?a[f].ch[1]=u:a[f].ch[0]=u;
a[cnt].fa=f;
a[cnt].son=1;
a[cnt].size=1;
a[cnt].v=x;
}
splay(u,0);
}
void find(int x){
int u=root;
if(!u)
return ;
while(x!=a[u].v&&a[u].ch[x>a[u].v])
u=a[u].ch[x>a[u].v];
splay(u,0);
}
int hou(int x){
find(x);
int u=root;
if(a[u].v>x)
return u;
u=a[u].ch[1];
while(a[u].ch[0])
u=a[u].ch[0];
return u;
}
int qian(int x){
find(x);
int u=root;
if(a[u].v<x)
return u;
u=a[u].ch[0];
while(a[u].ch[1])
u=a[u].ch[1];
return u;
}
void delet(int x){
int l=qian(x),r=hou(x);
splay(l,0),splay(r,l);
int u=a[r].ch[0];
if(a[u].size>1)
a[u].size--,splay(u,0);
else
a[r].ch[0]=0;
}
int k_th(int x){
int u=root;
if(a[u].son<x)
return 0;
while(1){
int s=a[u].ch[0];
if(x>a[s].son+a[u].size)
x-=a[s].son+a[u].size,u=a[u].ch[1];
else
if(a[s].son>=x)
u=s;
else
return a[u].v;
}
}
int hh[100001],b[10001];
int main(){
add(-21474847);
add(21474837);
int n=read(),x;
for(int i=1;i<=n;i++)
add(i);
for(int i=2;i<=n;i++)
b[i]=read();
for(int i=n;i>=1;i--)
x=k_th(b[i]+2),hh[i]=x,delet(x);
for(int i=1;i<=n;i++)
printf("%d\n",hh[i]);
return 0;
}

「POJ 2182」 Lost Cows的更多相关文章

  1. 「POJ 3666」Making the Grade 题解(两种做法)

    0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...

  2. 【POJ 2182】Lost Cows

    [题目链接] http://poj.org/problem?id=2182 [算法] 树状数组 + 二分 [代码] #include <algorithm> #include <bi ...

  3. 「POJ 3268」Silver Cow Party

    更好的阅读体验 Portal Portal1: POJ Portal2: Luogu Description One cow from each of N farms \((1 \le N \le 1 ...

  4. 「POJ Challenge」生日礼物

    Tag 堆,贪心,链表 Solution 把连续的符号相同的数缩成一个数,去掉两端的非正数,得到一个正负交替的序列,把该序列中所有数的绝对值扔进堆中,用所有正数的和减去一个最小值,这个最小值的求法与「 ...

  5. 「POJ 1135」Domino Effect(dfs)

    BUPT 2017 Summer Training (for 16) #3G 题意 摆好的多米诺牌中有n个关键牌,两个关键牌之间有边代表它们之间有一排多米诺牌.从1号关键牌开始推倒,问最后倒下的牌在哪 ...

  6. 「POJ - 1003」Hangover

    BUPT 2017 summer training (16) #2C 题意 n个卡片可以支撑住的长度是1/2+1/3+1/4+..+1/(n+1)个卡片长度.现在给出需要达到总长度,求最小的n. 题解 ...

  7. 「POJ - 2318」TOYS (叉乘)

    BUPT 2017 summer training (16) #2 A 题意 有一个玩具盒,被n个隔板分开成左到u右n+1个区域,然后给每个玩具的坐标,求每个区域有几个玩具. 题解 依次用叉积判断玩具 ...

  8. 「POJ 2699」The Maximum Number of Strong Kings

    题目链接 戳我 \(Describe\) 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边\((u, v)\)或\((v, u)\),表示\(u\)打败\(v\)或 ...

  9. 「POJ 1741」Tree

    题面: Tree Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define ...

随机推荐

  1. 【原创】 HBase 配置指南

    HBase 默认配置   Centos6.5下Hbase配置 官网配置文档:http://hbase.apache.org/book.html#_configuration_files 中文翻译转自: ...

  2. float型数据与字节数组的转化

    float型数据与字节数组的转化 字节(float)浮点数为例. 一.C语言 转化常见的方法有: 1.强制指针类型转换. [html] view plain copy //转换float数据到字节数组 ...

  3. C#字符串Split方法的误区

    string s = "aaa1bbb2ccc1ddd";        string[] ss = s.Split("12".ToCharArray()); ...

  4. 第一章 Spring整体架构和环境搭建(待续)

    ········

  5. java-虚拟机-索引

    底层 JVM之堆内存(年经代,老年代) Java内存泄露的理解与解决 内存溢出和内存泄漏的区别.产生原因以及解决方案 JVM内容梳理 Jvm的体系结构

  6. X11 转发

    SecureCRT只支持字符界面,如果要在终端界面能弹出GUI,需要本地安装X11 server,然后服务器讲X11请求forward到本地,即可. x11 server 可以使用Xming, Xma ...

  7. leetcode343

    public class Solution { public int IntegerBreak(int n) { ) { ; } ) { ; } var max = int.MinValue; ; i ...

  8. 页面布局整理(基于scss)

    页面开发步骤: 1.全局reset.设置基础背景色.设置基础字体样式 2.全局布局页面结构,meta 标签引入 3.按钮等相同的样式,用scss提前写好一份公用,渐变等 border-radius b ...

  9. mvc 实体类 自定义验证特性

    mvc 实体类验证的时候 如果有多个验证特性需要在属性上层叠很多个验证特性,显得属性特别臃肿并且也不够直观,极大地影响我使用它的兴趣,所以我想自定义一个验证特性,然后将所有需要验证的情形全部放在一个特 ...

  10. python:if 语句的使用方法

    if-else类型: #if-else num = int(input("输入成绩!")) if num > 60: print ("及格") else: ...