随机跳题挑战总结 Part5

前言

在这里插入图片描述←这个逼是真的\color{red}\texttt{菜}
颓废了nn个月,又和 WYCdaye , XXYdaye \texttt{ WYCdaye , XXYdaye }搞了一次随机挑战。
由于时间不多,两蓝一紫。
WYCdaye和XXYdaye\texttt{WYCdaye和XXYdaye}不屑于和本caiji\texttt{caiji}比赛所以就暂时咕了。

Link:XXYdaye的博客\huge\color{green}\texttt{Link:XXYdaye的博客}
Link:WYCdaye的博客\huge\color{blue}\texttt{Link:WYCdaye的博客}


题目

  1. P1627[CQOI2009]\color{blue}{P1627 [CQOI2009]中位数}
  2. P2267\color{blue}{P2267 琪琪的项链}
  3. P4254[JSOI2008]BlueMary\color{purple}{P4254 [JSOI2008]Blue Mary开公司}

在这里插入图片描述
本来跳到的不是这两道蓝题的,但是发现其中一道差分约束裸题,一道和银河英雄传说几乎一模一样,所以就换了。


题解

T1 P1627 [CQOI2009]中位数\color{blue}\texttt{P1627 [CQOI2009]中位数}

一道傻子题。没有单独写题解。
给出一个1n1\sim n的排列,问你有多少个长度为奇数的子区间中位数为bb
显然这个区间是包含bb的。
首先套路性的把大于bb的数字变成11,小于bb的数字变成1-1。然后就转换成问有多少个包含bb的区间的和为00的问题。
b11b-1\to 1做一次前缀和,从b+1nb+1\to n做一次前缀和,记录前缀和中每一个数字出现的次数,然后乘法原理搞一下就好了。
难度☆

#include <cstdio>
using namespace std;
typedef long long ll;

const int N=100010;
int n,m,pos,sum,a[N],cnt[N*2][2];
ll ans;

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if (a[i]>m) a[i]=1;
		else if (a[i]<m) a[i]=-1;
		else a[i]=0,pos=i;
	}
	cnt[100000][1]=cnt[100000][2]=1;
	for (int i=pos-1;i>=1;i--)
	{
		sum+=a[i];
		cnt[sum+100000][1]++;
	}
	sum=0;
	for (int i=pos+1;i<=n;i++)
	{
		sum+=a[i];
		cnt[sum+100000][2]++;
	}
	for (int i=100000-n;i<=100000+n;i++)
		ans=ans+(ll)cnt[i][1]*cnt[200000-i][2];
	printf("%lld",ans);
	return 0;
}

T2 P2267 琪琪的项链\color{blue}\texttt{P2267 琪琪的项链}

思维难度和怠慢难度都不是很难,容易发现每一个位置只能由一个区间的转移过来
所以前缀和搞搞就好了。
难度☆☆
Link 题解链接\color{red}\texttt{Link 题解链接}


T3 P4254 [JSOI2008]Blue Mary开公司\color{purple}\texttt{P4254 [JSOI2008]Blue Mary开公司}

李超线段树的裸题。之前没有了解过这个线段树。其实也不是很难。
这里推荐一篇 博客 ,讲解的还是很好的。
难度☆☆☆
Link 题解链接\color{red}\texttt{Link 题解链接}


总结

在这里插入图片描述

posted @ 2019-10-07 08:58  全OI最菜  阅读(133)  评论(0编辑  收藏  举报