最新文章
这里会显示最新的几篇文章摘要。
记录生活,分享知识,与你一起成长。
这里会显示最新的几篇文章摘要。
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\) 行,表示每头奶牛的最大可能高度.
9 3 5 5
1 3
5 3
4 3
3 7
9 8
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';
}
}