洪尼玛有n个朋友,n个朋友排成一排,每个朋友都有一个自身的价值Ai,并且每个朋友自身的价值均不相同。现在每个朋友都能与他左右的若干个人组成一个区间,也可以他自己一个人组成一个区间。若这个区间的人数为奇数个,那么我们称其为“可行区间”。将一个 “可行区间”里所有朋友按价值排序后,中间的那个朋友就是这个“可行区间”里的“宝宝”。求每个朋友是多少个“可行区间”里的“宝宝”?
Input
多组测试数据。
输入第一行为正整数n,表示朋友个数。
接下来一行,有n个互不相同的正整数Ai,表示第i个朋友的价值。
n≤1000,Ai≤10^9
Output
输出n个正整数,依次表示第i个朋友是多少个“可行区间”里的“宝宝”。
Sample Input
5
1 2 3 4 5
Sample Output
1 2 3 2 1
Hint
Input
多组测试数据。
输入第一行为正整数n,表示朋友个数。
接下来一行,有n个互不相同的正整数Ai,表示第i个朋友的价值。
n≤1000,Ai≤10^9
Output
输出n个正整数,依次表示第i个朋友是多少个“可行区间”里的“宝宝”。
Sample Input
5
1 2 3 4 5
Sample Output
1 2 3 2 1
Hint
例如3能组成的“可行间”有:{3},{1,2,3},{2,3,4},{3,4,5},{1,2,3,4,5} 共5个区间,其中在{3},{2,3,4},{1,2,3,4,5} 这3个“可行区间”里是宝宝。
题意:找第i个数是多少个区间的中位数,区间由连续子序列按从小到大的顺序排好
思路:1000的数据暴力即可,因为这个序列刚开始的无序的,构成的区间是有序的,所以我们可以枚举ai左边的数字,在这个序列内统计找在ai左边比ai大的数字-比ai小的数字数量=ai右边比ai小的数字-比ai大的数字的数量,如果在处理一边出现等于0的情况,则结果加一,处理的时候注意一下数组即可。
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
#include <set>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 1e3+5;
int a[N],aa[2*N];
int ans[N];
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
int num=0;
memset(aa,0,sizeof(aa));
for(int j=i-1;j>=0;j--)
{
if(a[j]<a[i])
num--;
else
num++;
if(!num) ans[i]++; //特殊情况结果+1
aa[num+N]++; //得到左边比ai大的数字-比ai小的数字数量
}
num = 0;
for(int j=i+1;j<n;j++)
{
if(a[j]<a[i])
num--;
else
num++;
if(!num)
ans[i]++;
ans[i] += aa[N-num];//一次加上左边所有的相符的数量
}
}
for(int i=0; i<n; i++)
{
if(i!=n-1)
printf("%d ",ans[i]+1);//加上本身
else
printf("%d\n",ans[i]+1);
}
}
return 0;
}