題目大意
一羣奶牛排成一排。他們身高不同。
現在我們知道:有n頭奶牛,第I頭的身高最高,爲h。
下面給出m組關係,每組關係包含兩個數,表示這兩個數代表的奶牛可以相互看到(兩頭奶牛之間的所有奶牛都比這兩頭奶牛矮才能相互看到)
題目要求我們給出所有n頭奶牛的可能最大身高。
題解
我們這裏採用差分。
差分數組先初始化0.
既然兩頭奶牛相互看到是因爲他們之間的所有奶牛的身高都比他們矮,那麼要求最大值,那麼矮的相對值應該最小,因爲身高都是整數,那麼就在兩頭奶牛之間所有奶牛的身高都-1.
最後,我們會發現,第I頭奶牛的差分數組一定是0.那麼所有奶牛的最大身高就是差分數組裏的值+h。
坑1
給出的相互看到的關係(x,y)有可能是x>y。要先判定是否需要交換
坑2
看到的關係有可能重複出現,需要用一個map來確定是否出現過。
code
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
inline int read(){
int num=0;char c=' ';bool flag=true;
for(;c>'9'||c<'0';c=getchar())
if(c=='-')
flag=false;
for(;c>='0'&&c<='9';num=(num<<3)+(num<<1)+c-48,c=getchar());
return flag ? num : -num;
}
const int maxn=10020;
int n,I,h,m,a[maxn];
map<pair<int,int>,bool>appear;
void work1(){
n=read();I=read();
h=read();m=read();
for(int i=1;i<=m;i++){
int x=read();
int y=read();
if(x>y)swap(x,y);//坑1
if(appear[make_pair(x,y)])continue;
a[x+1]--;a[y]++;
appear[make_pair(x,y)]=true;//坑2
}
}
void work2(){
for(int i=1;i<=n;i++)
a[i]+=a[i-1];
for(int i=1;i<=n;i++)
printf("%d\n",a[i]+h);
}
int main(){
work1();
work2();
return 0;
}