Description
有n(1 ≤ N ≤ 10,000)头牛,告诉你第i头牛的身高是最高的,并告诉你第i头牛的身高h(1 ≤ H ≤ 1,000,000)。还会告诉你一共有r(0 ≤ R ≤ 10,000)对牛可以对视,可以对视的两头牛之间的牛的身高严格小于这两头牛的身高(这两头牛的身高不一定相同,要注意!!!!!)
现在要求你求出每头牛在以上条件下的最大身高
全 都 是 自 己 翻 译 的 ,真 哒 !!!
Input
第一行:四个整数:N,I,H,R
第二行到第R+1行:可以对视的两头牛的编号A,B
Output
一共N行,为每一头牛的最大身高
Sample Input
-
9 3 5 5 1 3 5 3 4 3 3 7 9 8
Sample Output
-
5 4 5 3 4 4 5 5 5
思路:
- 我们可以用数组cow处理哪一个区间的牛比两边的牛矮(找可以对视的牛,每对可以对视的牛之间的牛一定比它们矮,cow[a+1]~cow[b]),最后再加上最高的牛的身高则为解,但是输入每一对是用一个for来标记的话,时间复杂度为n*m,会爆!!!所以我们要换一种方法来预处理。
- 我们可以先在两端打上标记,在cow[a+1]的位置标上-1,在cow[b](不是b-1!!)的位置标上+1(cow[]:000-10000+100)
- 然后一个for跑前缀和统计(cow[]:000-1-1-1-1-1000)
- ~(≧▽≦)/~最后再加上最高的牛的身高就ojbk啦~(≧▽≦)/~
- 最后提示,两头牛的对视关系(a,b)可能会重复输入,要特判!!!!!
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,p,h,m,line[10001],cow[10001],x,y;
bool check[10001][10001];
int main()
{
scanf("%d%d%d%d",&n,&p,&h,&m);
cow[p]=h;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
if (not(check[x][y]))//去重
{
line[x+1]--; line[y]++;//标记两端
check[x][y]=not(check[x][y]);
}
}
for(int i=1;i<=n;i++)
{
cow[i]=cow[i-1]+line[i];//前缀和
printf("%d\n",cow[i]+h);//加入牛的身高,求出每头牛的最大身高
}
}