现在有 N 头奶牛,已知第 I 头牛是所有牛中最高的牛(或最高的之一),身高为 H ;我们还知道 R 种关系,每一种关系包含的 a , b表示第 a 头牛可以看见第 b 头牛(即第 b 头牛的身高不低于第 a 头牛的身高,
并且它们中间的牛的身高都不高于 a 的身高),求每头牛的最高可能身高。
模拟就是从min(a,b)开始,到max(a,b)不满足的就减到满足
贪心可得a,b相等时最优
注意,不会出现a,x,b,y (a,b) (x,y) 的情况
所以就可以一层一层减去1,使得满足条件
但有可能会重复减去多次,所以要判重,如果用bool数组会超时
所以可以用map
map<pair<int,int>,bool>vis;
if(vis[make_pair(a,b)]) continue;
vis[make_pair(a,b)]=true
不要忘记swap一下a,b
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<map> 7 using namespace std; 8 const int maxn=10007; 9 int N,I,H,R,d[maxn]; 10 map<pair<int,int>,bool>vis; 11 int main(){ 12 cin>>N>>I>>H>>R; 13 for(int i=1;i<=R;i++){ 14 int a,b;cin>>a>>b; 15 if(a>b) swap(a,b); 16 if(vis[make_pair(a,b)]) continue; 17 d[a+1]--;d[b]++; 18 vis[make_pair(a,b)]=true; 19 } 20 for(int i=1;i<=N;i++){ 21 d[i]+=d[i-1]; 22 cout<<H+d[i]<<endl; 23 } 24 return 0; 25 }