您的位置:首页 > 产品设计 > UI/UE

D - BestCoder Sequence

2015-07-31 23:08 344 查看
题目要求的是中位数,不是中间那个数,,,所以要对 选取的那几个连续的数排一下序, 例如 9 2 8 5 1 她的中位数是5不是8

我的思路是 以要求的数m为基准,往右边for 一遍,如果a[i]>m cun1++ else cun1-- 然后把vis[cun1]++; 注意由于要求长度是奇数,所以还把每一个cun1分成奇数的cun1和偶数的cun1

同理左边也是这样

最后for 左端点到 m的位置 如果奇数对应的cun1==奇数对应的cun2(也就是合成的子串长度是奇数,并且大于m和小于m的个数一样多)

就为符合条件的子串

最后要注意的是 cun1或==0 且与m构成子串长度为奇数时 也能单独和m构成一个合法子串

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std; 
int  tm[40000+5]; 
struct node 
{
	int odd;
	int even;
}
   vis[40000+50];
   int zero[40000+50];
int min(int a,int b)
{
	if (a<b)
		return a;
	return b;
}
int main()
{ 
	int n,m,i;
	int j,k;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(vis,0,sizeof(vis)); 
		int mark;
		int ok=0;
		for (i=1;i<=n;i++)
		{
			scanf("%d",&tm[i]);
			if (tm[i]==m)
			{
				mark=i;		
			}
		}
	 
		int sum=0;
			int cun1=0;
			for (i=mark+1;i<=n;i++)
			{
				if (tm[i]<m)
					cun1--;
				else
					cun1++;
				if (cun1==0)
				{
					zero[++ok]=i;
				}
			if ((mark-i)%2==0)
				vis[20000+cun1].odd++;
			else
				vis[20000+cun1].even++;
			}

				int cun2=0;
			for (i=mark-1;i>=1;i--)
			{
				if (tm[i]<m)
					cun2++;
				else
					cun2--; 
				if (cun2==0)
				{
					zero[++ok]=i;
				}

				if ((mark-i)%2==0)	
				sum+=vis[20000+cun2].odd;
				else
					sum+=vis[20000+cun2].even;

			} 
			for (i=1;i<=ok;i++)
			{
				if (zero[i]>mark)
				{
						if ((zero[i]-mark)%2==0)
						sum++;
				}
				else
				{
						if ((mark-zero[i])%2==0)
						sum++;
					
				} 
			}

				printf("%d\n",sum+1); 
			
		}
		
		
		return 0;
		
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: