前言
←这个逼是真的
菜
\color{red}\texttt{菜}
菜
颓废了
n
n
n个月,又和
WYCdaye
,
XXYdaye
\texttt{ WYCdaye , XXYdaye }
WYCdaye , XXYdaye 搞了一次随机挑战。
由于时间不多,两蓝一紫。
WYCdaye和XXYdaye
\texttt{WYCdaye和XXYdaye}
WYCdaye和XXYdaye不屑于和本
caiji
\texttt{caiji}
caiji比赛所以就暂时咕了。
Link:XXYdaye的博客
\huge\color{green}\texttt{Link:XXYdaye的博客}
Link:XXYdaye的博客
Link:WYCdaye的博客
\huge\color{blue}\texttt{Link:WYCdaye的博客}
Link:WYCdaye的博客
题目
- P 1627 [ C Q O I 2009 ] 中 位 数 \color{blue}{P1627 [CQOI2009]中位数} P1627[CQOI2009]中位数
- P 2267 琪 琪 的 项 链 \color{blue}{P2267 琪琪的项链} P2267琪琪的项链
- P 4254 [ J S O I 2008 ] B l u e M a r y 开 公 司 \color{purple}{P4254 [JSOI2008]Blue Mary开公司} P4254[JSOI2008]BlueMary开公司
本来跳到的不是这两道蓝题的,但是发现其中一道差分约束裸题,一道和银河英雄传说几乎一模一样,所以就换了。
题解
T1 P1627 [CQOI2009]中位数 \color{blue}\texttt{P1627 [CQOI2009]中位数} P1627 [CQOI2009]中位数
一道傻子题。没有单独写题解。
给出一个
1
∼
n
1\sim n
1∼n的排列,问你有多少个长度为奇数的子区间中位数为
b
b
b。
显然这个区间是包含
b
b
b的。
首先套路性的把大于
b
b
b的数字变成
1
1
1,小于
b
b
b的数字变成
−
1
-1
−1。然后就转换成问有多少个包含
b
b
b的区间的和为
0
0
0的问题。
从
b
−
1
→
1
b-1\to 1
b−1→1做一次前缀和,从
b
+
1
→
n
b+1\to n
b+1→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 琪琪的项链} P2267 琪琪的项链
思维难度和怠慢难度都不是很难,容易发现每一个位置只能由一个区间的转移过来
所以前缀和搞搞就好了。
难度☆☆
Link
题解链接
\color{red}\texttt{Link 题解链接}
Link 题解链接
T3 P4254 [JSOI2008]Blue Mary开公司 \color{purple}\texttt{P4254 [JSOI2008]Blue Mary开公司} P4254 [JSOI2008]Blue Mary开公司
李超线段树的裸题。之前没有了解过这个线段树。其实也不是很难。
这里推荐一篇 博客 ,讲解的还是很好的。
难度☆☆☆
Link
题解链接
\color{red}\texttt{Link 题解链接}
Link 题解链接