前言
←这个逼是真的
颓废了个月,又和搞了一次随机挑战。
由于时间不多,两蓝一紫。
不屑于和本比赛所以就暂时咕了。
题目
本来跳到的不是这两道蓝题的,但是发现其中一道差分约束裸题,一道和银河英雄传说几乎一模一样,所以就换了。
题解
T1
一道傻子题。没有单独写题解。
给出一个的排列,问你有多少个长度为奇数的子区间中位数为。
显然这个区间是包含的。
首先套路性的把大于的数字变成,小于的数字变成。然后就转换成问有多少个包含的区间的和为的问题。
从做一次前缀和,从做一次前缀和,记录前缀和中每一个数字出现的次数,然后乘法原理搞一下就好了。
难度☆
#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
思维难度和怠慢难度都不是很难,容易发现每一个位置只能由一个区间的转移过来
所以前缀和搞搞就好了。
难度☆☆
T3
李超线段树的裸题。之前没有了解过这个线段树。其实也不是很难。
这里推荐一篇 博客 ,讲解的还是很好的。
难度☆☆☆