BC-Round 3 HDU 4908

  HDU     4908

   题目链接:          点击打开链接


           一开始看题目的时候还以为题目里 median number 的意思是中间的数。。果然英语不太好。。。交了两遍wa。。后来看到比赛时滚条里说是中位数的意思。再做时开始是用两个循环遍历的,结果又是TLE了。当时想到用dp做,但是dp神马的每次都找不出公式。数学真心捉急。看了很多别人的思路后发现基本都分成两种方法,一种是我下面贴的,还有一种是组合数学。。。但是数学。。。咳。。所以还是默默理解了第一种。。。。

        ans中的0、1是用来确保子串的长度为奇数,然后在这个基础上通过m位置前后两次的比较分别得出长度为奇数的子串当big数和small数正好相等的数量,还要加上m本身作为子串的1。代码不长,但是挺值得思考的,是自己没有用过的方法。

#include
#include
#define MAXN 40005

int a[MAXN];
int ans[2][MAXN*2];

int main()
{
	int n,m;
	int cnt;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int i;
		int x;
		int big,small;
		for(i=0;i=0;--i)
		{
			if(a[i]>a[x])
				big++;
			else
				small++;
			ans[(x-i)&1][big-small+MAXN]++;
		}
		small=big=0;
		for(i=x;ia[x])
				big++;
			else if(a[i]


你可能感兴趣的:(水题,BC)