cogs 181. [USACO Jan07] 最高的牛

181. [USACO Jan07] 最高的牛

★★   输入文件:tallest.in   输出文件:tallest.out   简单对比
时间限制:1 s   内存限制:32 MB

FJ‘s N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of that cow.

FJ has made a list of R (0 ≤ R ≤ 10,000) lines of the form "cow 17 sees cow 34". This means that cow 34 is at least as tall as cow 17, and that every cow between 17 and 34 has a height that is strictly smaller than that of cow 17.

For each cow from 1..N, determine its maximum possible height, such that all of the information given is still correct. It is guaranteed that it is possible to satisfy all the constraints.

为了方便我们把FJ养的N头(1 ≤ N ≤ 10,000)奶牛从1号开始编号,一直编到N号,并且让他们站成一列。每头牛都有一个正整数用来描述她的身高(有些牛不愿意说,她们的身高保密)。你只知道这些牛中最高的那一头的身高是H,她的编号是第I号。

FJ写了一张单子,上面有R个陈述句,大概是”第17号牛可以看见第34号牛”这种。这意味着第34号牛最起码和第17号牛一样高。而且17号牛和34号牛之间的牛得身高都严格的小于min(H[17],H[34])。

从第1号牛到第N号牛,求她们可能拥有的最大身高,所给出的所有信息都是正确的。这可以保证满足所有条件。

Input

  • Line 1: Four space-separated integers: N, I, H and R
  • Lines 2..R + 1: Two distinct space-separated integers A and B (1 ≤ A, B ≤ N), indicating that cow A can see cow B.

输入:

第1行:四个由空格分开的整数,N,I,H和R。

第2..R+1行:两个由空格分开的整数A和B(1 ≤ A, B ≤ N),表示第A号牛可以看到第B号牛。

Output

  • Lines 1..N: Line i contains the maximum possible height of cow i.

输出:

第1..N行:第i行包括第i号牛可能拥有的最大身高。

Sample Input

9 3 5 5
1 3
5 3
4 3
3 7
9 8

Sample Output

5
4
5
3
4
4
5
5
5

Input Details

There are 9 cows, and the 3rd is the tallest with height 5.

输入细节:

由9头奶牛,第三头奶牛最高,身高是5.

译byKZFFFFFFFF

思路:线段树。

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 10000
using namespace std;
map<int,int>ma[MAXN];
struct nond{
    int l,r,flag;
}tree[MAXN*4];
long long n,I,H,R;
void build(int now,int l,int r){
    tree[now].l=l;tree[now].flag=0;
    tree[now].r=r;
    if(tree[now].l==tree[now].r)
        return ;
    long long mid=(tree[now].l+tree[now].r)/2;
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
}
void down(int now){
    tree[now*2].flag+=tree[now].flag;
    tree[now*2+1].flag+=tree[now].flag;
    tree[now].flag=0;
}
void change(int now,int l,int r){
    if(tree[now].l==l&&tree[now].r==r){
        tree[now].flag+=1;
        return ;
    }
    if(tree[now].flag)    down(now);
    int mid=(tree[now].l+tree[now].r)/2;
    if(r<=mid)    change(now*2,l,r);
    else if(l>mid)    change(now*2+1,l,r);
    else{
        change(now*2,l,mid);
        change(now*2+1,mid+1,r);
    }
}
int query(int now,int x){
    if(tree[now].l==tree[now].r)
        return tree[now].flag;
    if(tree[now].flag)    down(now);
    int mid=(tree[now].l+tree[now].r)/2;
    if(x<=mid)    return query(now*2,x);
    else if(x>mid)    return query(now*2+1,x);
}
int main(){
    //freopen("tallest.in","r",stdin);
    //freopen("tallest.out","w",stdout);
    while(scanf("%lld%lld%lld%lld",&n,&I,&H,&R)!=EOF){
        build(1,1,n);
        for(int i=1;i<=R;i++){
            long long a,b;
            scanf("%lld%lld",&a,&b);
            if(a>b)    swap(a,b);
            if(ma[a][b])    continue;
            ma[a][b]=1;
            if(a+1==b)    continue;
            change(1,a+1,b-1);
        }
        for(long long i=1;i<=n;i++)
            cout<<H-query(1,i)<<endl;
    }
}

一直调不对的20分代码

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
const int maxn=10000+100;
int LL[maxn],RR[maxn];
long long N,H,R,I;
long long add[maxn<<2],ans[maxn];
struct node{
    int l,r;
    int sum;
}t[maxn<<2];
void pushdown(int rs)//向下更新lazy积累的值
{
    if(add[rs])
    {
        add[rs<<1]+=add[rs];
        add[rs<<1|1]+=add[rs];
        add[rs]=0;
    }
}
void build(int rs,int l,int r)
{
    t[rs].l=l;
    t[rs].r=r;
    add[rs]=0;
    if(l==r)
    {
        t[rs].sum=H;
        return ;
    }
    int mid=(l+r)>>1;
    build(rs<<1,l,mid);
    build(rs<<1|1,mid+1,r);
}
void update(int l,int r,int rs)//更新操作
{
    if(t[rs].l>=l&&t[rs].r<=r)
    {
        add[rs]+=1;
        return ;
    }
    pushdown(rs);
    int mid=(t[rs].l+t[rs].r)>>1;
    if(l<=mid)   update(l,r,rs<<1);
    if(r>mid)  update(l,r,rs<<1|1);
}
int query(int k,int rs)
{
    if(t[rs].l==t[rs].r)
    {
        return t[rs].sum-=add[rs];
    }
    pushdown(rs);
    int mid=(t[rs].l+t[rs].r)>>1;
    if(k<=mid)  return query(k,rs<<1);
    else  return query(k,rs<<1|1);
}
int main()
{
    freopen("tallest.in","r",stdin);
    freopen("tallest.out","w",stdout);
    int u,v;
   scanf("%I64d%I64d%I64d%I64d",&N,&I,&H,&R);
        build(1,1,N);
        int k=0;
        while(R--)
        {
            scanf("%d%d",&u,&v);
            if(u>v)  swap(u,v);
            int flag=1;
            for(int i=0;i<k;i++)//判断重边,在poj做题一定要防这东西
            {
                if(u==LL[i]&&v==RR[i])
                {
                    flag=0;
                    break;
                }
            }
            if(!flag)
                continue;
            LL[k]=u;RR[k]=v;
            k++;
            if(v-u==1)//相邻的话就不用更新了
                continue;  

            update(u+1,v-1,1);//注意是开区间的值更新
        }
        for(int i=1;i<=N;i++)
            ans[i]=query(i,1);
        for(int i=1;i<=N;i++)
            printf("%I64d\n",ans[i]);
    return 0;
}  

原文地址:https://www.cnblogs.com/cangT-Tlan/p/8151173.html

时间: 2024-08-02 19:19:23

cogs 181. [USACO Jan07] 最高的牛的相关文章

cogs 182. [USACO Jan07] 均衡队形 线段树

182. [USACO Jan07] 均衡队形 ★★☆   输入文件:lineup.in   输出文件:lineup.out   简单对比时间限制:4 s   内存限制:128 MB 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按同样的顺序站好.一日,农夫约翰决定为奶牛们举行一个“终极飞盘”比赛.为简化问题,他将从奶牛队列中选出一个连续区间来进行游戏.不过,参加游戏的奶牛要玩的开心的话就不能在身高上差距太大. 农夫约翰制定了 Q (1 ≤ Q ≤ 200,0

COGS182 [USACO Jan07] 均衡队形[RMQ]

182. [USACO Jan07] 均衡队形 ★★   输入文件:lineup.in   输出文件:lineup.out   简单对比时间限制:4 s   内存限制:128 MB 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按同样的顺序站好.一日,农夫约翰决定为奶牛们举行一个“终极飞盘”比赛.为简化问题,他将从奶牛队列中选出一个连续区间来进行游戏.不过,参加游戏的奶牛要玩的开心的话就不能在身高上差距太大. 农夫约翰制定了 Q (1 ≤ Q ≤ 200,00

RMQ——[USACO Jan07] 均衡队形

题目:[USACO Jan07] 均衡队形 描述: 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按同样的顺序站好.一日,农夫约翰决定为奶牛们举行一个“终极飞盘”比赛.为简化问题,他将从奶牛队列中选出一个连续区间来进行游戏.不过,参加游戏的奶牛要玩的开心的话就不能在身高上差距太大. 农夫约翰制定了 Q (1 ≤ Q ≤ 200,000) 个预定的参赛组,给出它们的身高 (1 ≤ 身高 ≤ 1,000,000).对每个参赛组,他需要你帮助确定组中最高牛和最低牛的

cogs 133. [USACO Mar08] 牛跑步 A*算法

by http://blog.csdn.net/jarily/article/details/8871968/* *算法引入: *在单源点最短路径问题中,实际运用时还需知道最短路径外,次短路或者第三短路; *即要知道多条最短路,并排出其长度增加的顺序,即为K最短路问题; * *算法思想: *单源点最短路径+高级搜索A*; *A*算法结合了启发式方法和形式化方法; *启发式方法通过充分利用图给出的信息来动态地做出决定而使搜索次数大大降低; *形式化方法不利用图给出的信息,而仅通过数学的形式分析;

cogs 1435. [USACO NOV]金发姑娘和N头牛

1435. [USACO NOV]金发姑娘和N头牛 ★★☆   输入文件:milktemp.in   输出文件:milktemp.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 你可能已经听说了金发姑娘和3只熊的经典故事. 鲜为人知的是,金发姑娘最终经营了一个农场.在她的农场,她有一个谷仓含N头奶牛(1<=N <= 20000).不幸的是,她的奶牛对温度相当敏感. 第i头奶牛必须在指定的温度范围内A(i)..B(i)才感觉舒适:(0<=A(i)<=B

COGS 133. [USACO Mar08] 牛跑步

★★★   输入文件:cowjog.in   输出文件:cowjog.out   简单对比时间限制:1 s   内存限制:128 MB Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M(1<=M<=10,000)条路,每条路连接两个用1..N(1<=N<=1000)标号的地点. 更方便的是,如果X>Y,则地点X的高度大于地点Y的高度. 地点N是Bess

COGS——T1588. [USACO FEB04]距离咨询

http://cogs.pro/cogs/problem/problem.php?pid=1588 ★★   输入文件:dquery.in   输出文件:dquery.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 农夫约翰有N(2<=N<=40000)个农场,标号1到N.M(2<=M<=40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样,图中农场用F1..F7表示: 每个农场最多能在东西南北

cogs 397. [USACO Oct09] 热浪

传送门 ★☆   输入文件:heatwvx.in   输出文件:heatwvx.out   简单对比 时间限制:1 s   内存限制:128 MB 第九題: 熱浪 [300分] [Rob Kolstad (傳統題目), 2009] 德克薩斯純樸的民眾們這個夏天正在遭受巨大的熱浪!!!他們的德克薩斯長角牛吃起來不錯,可是他們並不是很擅長生產富含奶油的乳製品.Farmer John此時以先天下之憂而憂,後天下之樂而樂的精神,身先士卒地承擔起向德克薩斯運送大量的營養冰涼的牛奶的重任,以減輕德克薩斯人忍

cogs 762. [USACO Open09] 奶牛队列

★   输入文件:cline.in   输出文件:cline.out   简单对比时间限制:1 s   内存限制:128 MB 农夫约翰有N头牛,编号依次为1-N,他正在把这些牛排成一队,队伍中开始是没有牛的,随着时间推移,牛儿一个一个地从左端或右端加入到队伍中来.令人烦心的是,随时会有一些牛从左端或右端离开队伍溜向草场. FJ正费劲地给牛排队,请你帮帮他. 奶牛按1-N的顺序入队,牛一旦离队就再也不会回来了,你的程序将处理给定的S(1 <= S <= 100,000)个输入指令,每一个指令占