最新文章

这里会显示最新的几篇文章摘要。

最高的牛(差分)

P2879 [USACO07JAN] Tallest Cow S

题目描述

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

输入格式

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

接下来 \(R\) 行:两个不同的整数 \(a\)\(b\)\(1 \le a, b \le n\)

输出格式

一共 \(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

说明/提示

\(1 \le n \le 10000\)\(1 \le h \le 1000000\)\(0 \le R \le 10000\)

分析

牛的高度只能是嵌套形式的,每给出一个区间,说明区间之间的牛都比两端的矮,由于求最大的的高度,那么假设所有牛都最高,出现区间,那么区间牛高度减少,这样本质就是差分,但是注意,出现相同的区间不能再减,所有使用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 @ 2025-02-20 20:26  bakul  阅读(62)  评论(0)    收藏  举报