从后往前查第一个为0的奶牛肯定应该排在第一个。每次从后往前找到第一个为0的数,这个数应该插在第j位。查找之后,修改节点的值为极大值,当整棵树的最小值不为0的时候查找结束。

至于这种查找修改的操作,再没有比线段树效率更高的了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 8005
#define M 16100
struct node
{
int x,y;
int min;
int flag;
}a[N*3];
int b[N],c[N];
int Min(int x,int y)
{
if(x<y)
return x;
else
return y;
}
void ChangeTree(int t,int k)
{
a[t].flag+=k;
a[t].min+=k;
return ;
}
void CreatTree(int t,int x,int y)
{
a[t].x=x;
a[t].y=y;
a[t].flag=0;
if(x==y)
{
a[t].min=b[x];
return ;
}
int temp=t*2;
int mid=(a[t].x+a[t].y)/2;
CreatTree(temp,x,mid);
CreatTree(temp+1,mid+1,y);
a[t].min=Min(a[temp].min,a[temp+1].min);
return ;
}
void InsertTree(int t,int x,int y,int k)
{
if(a[t].x==x&&a[t].y==y)
{
ChangeTree(t,k);
return ;
}
int temp=t*2;
int mid=(a[t].x+a[t].y)/2;
if(a[t].flag)
{
ChangeTree(temp,a[t].flag);
ChangeTree(temp+1,a[t].flag);
a[t].flag=0;
}
if(y<=mid)
InsertTree(temp,x,y,k);
else if(x>mid)
InsertTree(temp+1,x,y,k);
else
{
InsertTree(temp,x,mid,k);
InsertTree(temp+1,mid+1,y,k);
}
a[t].min=Min(a[temp].min,a[temp+1].min);
return ;
}
int FindTree(int t)
{
if(a[t].x==a[t].y)
{
if(a[t].min==0)
return a[t].x;
else
return 0;
}
int temp=t*2;
if(a[t].flag)
{
ChangeTree(temp,a[t].flag);
ChangeTree(temp+1,a[t].flag);
a[t].flag=0;
}
if(a[temp+1].min==0)
return FindTree(temp+1);
else
return FindTree(temp);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j;
b[1]=0;
for(i=2;i<=n;i++)
scanf("%d",&b[i]);
CreatTree(1,1,n);
j=1;
while(a[1].min==0)
{
int tt;
tt=FindTree(1);
if(!tt)
tt=1;
c[tt]=j++;
InsertTree(1,tt,tt,M);
InsertTree(1,tt,n,-1);
}
for(i=1;i<=n;i++)
printf("%d\n",c[i]);
}
return 0;
}

hdu 2711&&poj2182 Lost Cows (线段树)的更多相关文章

  1. [poj2182] Lost Cows (线段树)

    线段树 Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacula ...

  2. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  3. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  4. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  5. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  6. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  7. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  8. hdu 1754 I Hate It 线段树 点改动

    // hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...

  9. hdu 1166 敌兵布阵 线段树 点更新

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

随机推荐

  1. cf Round 601

    A.The Two Routes(BFS) 给出n个城镇,有m条铁路,铁路的补图是公路,汽车和火车同时从1出发,通过每条路的时间为1,不能同时到达除了1和n的其它点,问他们到达n点最少要用多长时间. ...

  2. iOS8上放大缩小的动画

    CGAffineTransformMakeScale这个方法我们以前经常使用,但是在IOS8上出现问题了 [UIView animateWithDuration:0.3 animations:^{ b ...

  3. SQL2008附加数据库提示错误:5120

    前几天在附加数据库时,出现了这个错误           在win7 x64系统上使用sql2008进行附加数据库(包括在x86系统正在使用的数据库文件,直接拷贝附加在X64系统中)时,提示无法打开文 ...

  4. 切换加上延迟加载js代码

    切换加上延迟加载js代码 (function(){ var tit = $("#tab02 li"), con = $("#wrapmp>div"), c ...

  5. [HDOJ - 5282] Senior's String 【DP】

    题目链接:BZOJ - 5282 题目分析 LCS 就是用经典的 O(n^2) DP 解决,f[i][j] 表示 x 串前 i 个字符与 y 串前 j 个字符的 LCS 长度. f[i][j] = m ...

  6. uva 12648

    一个简单的搜索: 反正树的结构不会变,只需要把节点的名称换一下就行: 可惜比赛的时候思路不清晰: #include<cstdio> #define maxn 5050 #include&l ...

  7. Memcached总结四:用ava程序连接memcached进行操作

    1. Memcached的Java环境设置 需要下载spymemcached-2.10.3.jar,并把这个jar放到java程序的classpath中才能使用memcached. 在下面的程序,假设 ...

  8. hdu 4878 ZCC loves words AC自动机+中国剩余定理+快速幂

    题意就不说了. 分析:折腾好几天自己写的代码还是看了别人代码后发现几乎没什么复杂度的差别,可是就是一直超时,后来干脆照着别人写啊,一直WA,就在准备放弃干脆先写这篇博客的时候,又看了一眼WA的代码,发 ...

  9. Android Studio 快捷键 for Mac OS X 10.5+

    Action Mac OSX Win/Linux 注释代码(//) Cmd + / Ctrl + / 注释代码(/**/) Cmd + Option + / Ctrl + Alt + / 格式化代码 ...

  10. redis消息队列

    http://blog.csdn.net/21aspnet/article/details/7455032