USACO2007月赛银组的一道题目,比较简单。
题目描述:
有N头奶牛,已知最高奶牛的身高H和它的编号I。
给出R个限制,每个限制给出一对数{A,B}表示A能看到B,这里的能看到表示B和至少一样高(有可能B比A高),并且[A,B]中间的奶牛高度都要比A和B矮。
问这些奶牛最高的可能身高。
思路:
要让奶牛身高尽量高。那么对于某个纸条A->B来说,我们只希望[A+1,B-1]范围内的奶牛高度只比A和B低1。那么我们可以得到一个朴素算法,对于每次的纸条A->B,我们令[A+1,B-1]的奶牛高度都-1。这样我们可以保证最后得到的结果是尽量高的。复杂度是O(n^2)。
考虑到n最大为10000,O(n^2)的算法有点危险。实际上我们可以进行优化。对某个区间同时加法或减法,显然可以用差分数组。复杂度降到O(n)。
注意题目说了可能有重复的约束,所以要判重。可以用bitset或者map
代码:
#include<bits/stdc++.h> using namespace std; int N,I,H,R,b[10030]; bitset<100004000>v; int main() { cin>>N>>I>>H>>R; while(R--){ int A,B; cin>>A>>B; if(A>B)swap(A,B); if(v[A*10000+B])continue; v[A*10000+B]=1; b[A+1]--;b[B]++; } for(int i=0;i<=N;i++)b[i]+=b[i-1]; for(int i=1;i<=N;i++)b[i]+=H,cout<<b[i]<<endl; return 0; }