【差分 相对高度】 Tallest cow
传送门
题意
\(n\)头牛站成一行,都有身高,当两头牛它们中间的牛身高比他们都矮的时候,它们能够相互看见,已知最高的牛是第\(p\)头,身高\(h\)
其余的未知,但是知道这群牛存在\(m\)对关系,每对关系指明了两头牛\(a,b\)能够相互看见,求每头牛身高的最大可能值是多少,关系中可能存在重复
数据范围
\(\begin{array}{l}1 \leq N \leq 10000 \\ 1 \leq H \leq 1000000 \\ 1 \leq A, B \leq 10000 \\ 0 \leq M \leq 10000\end{array}\)
题解
时间复杂度为\(O(N+M)\)
\(A[ i ],B[ i ]\)两对关系对应牛的下标,建立数组\(p\),初始所有牛都是0,两头牛之间能够相互看到就将\(p\)中\(a+1\)和\(b-1\)中的数-1,因为最高的牛的身高在数组中为0,所以在执行完所有的操作后,用最高的牛的身高加上相对身高的值即为所有可能达到的最高身高。
为了加速区间上数字-1的操作开一个\(p\)的差分数组\(q\)实现\(O(1)\)执行区间的加减操作。
Code
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
const int N=1e4+10;
int n,idx,h,m;
int p[N],q[N];
map<pii,bool>cow;
int main(){
cin>>n>>idx>>h>>m;
for(int i = 1; i <= m; i++) {
int a,b;
cin>>a>>b;
if(a>b) swap(a,b);
if(cow[{a,b}]) continue;
q[a+1]--;
q[b]++;
cow[{a,b}]=1;
}
p[1]=q[1]+h;
for(int i = 1; i <= n; i++) {
p[i] = p[i - 1] + q[i];
cout<<p[i]+h<<endl;
}
}