POJ 2182&& POJ 2828:Lost Cows 从后往前 线段树
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 10544 | Accepted: 6754 |
Description
not line up in the required ascending numerical order of their brands.
Regrettably, FJ does not have a way to sort them. Furthermore, he's not very good at observing problems. Instead of writing down each cow's brand, he determined a rather silly statistic: For each cow in line, he knows the number of cows that precede that cow
in line that do, in fact, have smaller brands than that cow.
Given this data, tell FJ the exact ordering of the cows.
Input
* Lines 2..N: These N-1 lines describe the number of cows that precede a given cow in line and have brands smaller than that cow. Of course, no cows precede the first cow in line, so she is not listed. Line 2 of the input describes the number of preceding cows
whose brands are smaller than the cow in slot #2; line 3 describes the number of preceding cows whose brands are smaller than the cow in slot #3; and so on.
Output
Sample Input
5
1
2
1
0
Sample Output
2
4
5
3
1
有N头牛站成一列,每头牛只能看见自己前面比自己brand小的牛,这个数量给你了。问你每头牛的brand分别是多少。
就是查空位数量,如果有空位被占了,那么就往后面延。。。
只不过用了线段树的形式,以线段树的形式来找空位。len代表空位的数量。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; struct no
{
int L,R;
int len;
}tree[32005]; void buildtree(int root,int L,int R)
{
tree[root].L=L;
tree[root].R=R; tree[root].len = R-L+1; if(L!=R)
{
int mid = (L+R)>>1;
buildtree((root<<1)+1,L,mid);
buildtree((root<<1)+2,mid+1,R);
}
} int query(int root,int num)
{
tree[root].len--;
if(tree[root].L==tree[root].R)
{
return tree[root].L;
}
if(tree[(root<<1)+1].len >= num)
{
return query((root<<1)+1,num);
}
else
{
return query((root<<1)+2,num-tree[(root<<1)+1].len);
}
} int n;
int val[8005];
int ans[8005]; int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
buildtree(0,1,n);
val[1]=0; for(i=2;i<=n;i++)
{
scanf("%d",val+i);
}
for(i=n;i>=1;i--)
{
ans[i]=query(0,val[i]+1);
}
for(i=1;i<=n;i++)
{
printf("%d\n",ans[i]);
}
}
return 0;
}
POJ2828是它的姐妹题,买一送一。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; struct no
{
int L,R;
int len;
}tree[800005]; int n;
int val[200005];
int pos[200005];
int cnt[200005]; void buildtree(int root,int L,int R)
{
tree[root].L=L;
tree[root].R=R; tree[root].len = R-L+1; if(L!=R)
{
int mid = (L+R)>>1;
buildtree((root<<1)+1,L,mid);
buildtree((root<<1)+2,mid+1,R);
}
} void query(int root,int num,int val)
{
tree[root].len--;
if(tree[root].L==tree[root].R)
{
cnt[tree[root].L]=val;
return;
}
if(tree[(root<<1)+1].len >= num)
{
query((root<<1)+1,num,val);
}
else
{
query((root<<1)+2,num-tree[(root<<1)+1].len,val);
}
} int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
buildtree(0,1,n); for(i=1;i<=n;i++)
{
scanf("%d%d",pos+i,val+i);
}
for(i=n;i>=1;i--)
{
query(0,pos[i]+1,val[i]);
}
for(i=1;i<=n;i++)
{
if(i==1)
printf("%d",cnt[i]);
else
printf(" %d",cnt[i]);
}
printf("\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 2182&& POJ 2828:Lost Cows 从后往前 线段树的更多相关文章
- POJ 2182 / HDU 2711 Lost Cows(平衡树)
Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular di ...
- POJ 2182 Lost Cows(牛排序,线段树)
Language: Default Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9207 Acce ...
- poj 2482 Stars in Your Window + 51Nod1208(扫描线+离散化+线段树)
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13196 Accepted: ...
- POJ 3162 Walking Race(树形dp+单调队列 or 线段树)
http://poj.org/problem?id=3162 题意:一棵n个节点的树.有一个屌丝爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要 ...
- POJ 2886 Who Gets the Most Candies?(反素数+线段树)
点我看题目 题意 :n个小盆友从1到n编号按顺时针编号,然后从第k个开始出圈,他出去之后如果他手里的牌是x,如果x是正数,那下一个出圈的左手第x个,如果x是负数,那出圈的是右手第-x个,游戏中第p个离 ...
- POJ 2299 Ultra-QuickSort(线段树+离散化)
题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...
- POJ 2352 Stars(线段树)
题目地址:id=2352">POJ 2352 今天的周赛被虐了. . TAT..线段树太渣了..得好好补补了(尽管是从昨天才開始学的..不能算补...) 这题还是非常easy的..维护 ...
- poj 3468 A Simple Problem with Integers(原来是一道简单的线段树区间修改用来练练splay)
题目链接:http://poj.org/problem?id=3468 题解:splay功能比线段树强大当然代价就是有些操作比线段树慢,这题用splay实现的比线段树慢上一倍.线段树用lazy标记差不 ...
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...
随机推荐
- 嵌入式 printf的实现
在嵌入式中,经常需要用到printf来调试程序 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. printf输出到串口,需要将fputc ...
- Day3-H-Alice and Bob HDU4268
Alice and Bob's game never ends. Today, they introduce a new game. In this game, both of them have N ...
- MyEclipse Hibernate逆向工程的使用
简介MyEclipse自带很多非常实用的工具,本次将介绍Hibernate工具的使用.1.首先打开MyEclipse的Hibernate视图 2.然后在左上角的DB Browser视图中,右键,新建数 ...
- LoadRunner之Block
如何在一个脚本中实现不同事务不同次数的循环呢? 案例:假如你想在一个脚本中,实现登录执行1次,查询执行2次,插入执行3次,怎么办?录3个脚本?每个事务分别在脚本中复制N次? 当然不用,LR早就想到了你 ...
- P1058 选择题
P1058 选择题 转跳点:
- HihoCoder第五周:标准动态规划
这周的题目是最标准最简单的动态规划了,自己一直以来对动态规划都不是很理解,这次也是好好记录一下. 题目1 :数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 ...
- Docker基本使用运行ngix镜像
docker pull 项目名 会从docker默认的仓库去拉去项目,如果是docker pull 项目名 地址 会从给定地址拉去镜像 docker run image名字 运行镜像 docker架 ...
- dubbo 相关面试题 有用(转)
调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...
- MySQL 中的数据库名称、数据表名称、字段名称
如何查询Oracle,Sql Server,MySQL 中的数据库名称.数据表名称.字段名称 分类: Database2012-09-24 22:16 7034人阅读 评论(0) 收藏 举报 数据库s ...
- 页面的html调试
点击页面按下键盘的F12,或者鼠标右键选择检查(N) 会弹出一个窗口,这个窗口就是调试窗口 如上图所示,第一个图标是标签元素选择器,点击使用后,在页面上移动,会在Elements的区域找到你鼠标选中的 ...