最高的牛(差分)

P2879 [USACO07JAN] Tallest Cow S

题目描述

FarmerJohn 有n头牛,它们按顺序排成一列。FarmerJohn 只知道其中最高的奶牛的序号及它的高度,其他奶牛的高度都是未知的。现在 FarmerJohn 手上有 R 条信息,每条信息上有两头奶牛的序号(ab),其中 b 奶牛的高度一定大于等于 a 奶牛的高度,且 a,b之间的所有奶牛的高度都比 a 小。现在 FarmerJohn 想让你根据这些信息求出每一头奶牛的可能的最大的高度。(数据保证有解)

输入格式

第一行:四个以空格分隔的整数:n,i,h,RnR 意义见题面;ih 表示第 i 头牛的高度为 h,他是最高的奶牛)

接下来 R 行:两个不同的整数 ab1a,bn

输出格式

一共 n 行,表示每头奶牛的最大可能高度.

输入输出样例 #1

输入 #1

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

输出 #1

5
4
5
3
4
4
5
5
5

说明/提示

1n100001h10000000R10000

分析

牛的高度只能是嵌套形式的,每给出一个区间,说明区间之间的牛都比两端的矮,由于求最大的的高度,那么假设所有牛都最高,出现区间,那么区间牛高度减少,这样本质就是差分,但是注意,出现相同的区间不能再减,所有使用set判重

代码

int height[10005],an[10005];  //差分数组和答案数组
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    //
    // freopen("E:/Code/C++/untitled1/input.txt","r",stdin);
    // freopen("output.txt","w",stdout);


    set< pair<int,int>> st; 
    int n,l,h,r;
    cin >> n >> l >> h >> r;
    height[1] = h;//相当于所有高度都加上h,初始化

    for(int i = 1;i <= r;++i)
    {
        int a,b;
        cin >> a >> b;
        if(a > b) swap(a,b);
        if(st.count({a,b})) continue;  //判重
        st.insert({a,b});
        height[a+1]--;   //注意差分写法,f[i]++,是对i及其之后的所有原数列进行操作
        height[b+1-1]++;   //在区间后的一个元素操作,恢复过多元素的操作
    }

    //height[0] = 0;
    for(int i = 1;i <= n;++i)
    {
        an[i] = height[i] + an[i-1];  //数组回复
        cout << an[i] << '\n';
    }

}
posted @   bakul  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示