牛客练习赛 115 记录

发布时间 2023-09-08 22:21:21作者: shyiaw

牛客练习赛115

赛时 AC 题目

A. Mountain sequence

点击查看代码
/*
1. 根据山峰数列的定义,用排列组合知识去计算即可。
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;
int t,n;
int a[maxn];
ll ans;
const int MOD=998244353;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		ans=1ll;
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+n+1);
		int e=n;
		while(a[e]==a[n]) e--;
		int cnt=0,s=0;
		for(int i=1;i<=e;i++)
		{
			if(a[s]!=a[i])
			{
				ans=(cnt+1)*ans%MOD;
				s=i,cnt=1;
			}
			else cnt++;
		}
		ans=(cnt+1)*ans%MOD;
		printf("%lld\n",ans);
	}
}

B. Antiamuny wants to leaern binary search again

点击查看代码
/*
1. 模拟+贪心的水题。
*/
#include<bits/stdc++.h>
using namespace std;
int t,l,r,cnt;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&l,&r,&cnt);
		int pos;
		while(cnt&&l<=r)
		{
			pos=(l+r)>>1;
			if(r-pos>pos-l) l=pos+1;
			else r=pos-1;
			cnt--;
		}
		if(cnt) printf("-1\n");
		else printf("%d\n",pos);
	}
	return 0;
}

C. Find the maximum slope

点击查看代码
/*
1. 突破点在于发现,$\max\limits_{i\ne j}\{|\frac{a_i-a_j}{i-j}|\}$ 一定在当 $j=i+1$ 时取到(可以用**反证法**证明),故只需计算相邻元素的差的最大值。
2. 对于 $a$ 的差分数组 $d$,要求满足**单点修改**和**求区间最大值**的操作。本题中,由于区间一直是 $[2,n]$,故可直接用 $L$ 维护区间最大值,然后每次修改 $d$ 数组时,更新 $L$。
3. 代码中用了线段树,是因为当时没有注意到区间一直是 $[2,n]$(nt 了)。
*/
#include<bits/stdc++.h>
#define ld long double
#define lson i<<1
#define rson i<<1|1
using namespace std;
const int maxn=5e5+100;
int n,q,a[maxn];
struct ST
{
	int mx,mi;
}t[maxn<<2];
void build(int i,int L,int R)
{
	if(L==R) 
	{
		t[i].mx=t[i].mi=a[R+1]-a[R];
		return;
	}
	int mid=(L+R)>>1;
	build(i<<1,L,mid),build(i<<1|1,mid+1,R);
	t[i].mx=max(t[i<<1].mx,t[i<<1|1].mx);
	t[i].mi=min(t[i<<1].mi,t[i<<1|1].mi);
	return;
}
void merge(int i,int l,int r,int pos,int k)
{
	if(l==r&&l==pos)
	{
		t[i].mx+=k,t[i].mi+=k;
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid) merge(lson,l,mid,pos,k);
	else merge(rson,mid+1,r,pos,k);
	t[i].mx=max(t[i<<1].mx,t[i<<1|1].mx);
	t[i].mi=min(t[i<<1].mi,t[i<<1|1].mi);
	return;
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	build(1,1,n-1);
	printf("%lf\n",1.0*max(abs(t[1].mx),abs(t[1].mi)));
	while(q--)
	{
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		if(l-1)merge(1,1,n-1,l-1,k);
		if(r<n)merge(1,1,n-1,r,-k);
		printf("%lf\n",1.0*max(abs(t[1].mx),abs(t[1].mi)));
	}
	return 0;
}

赛事未 AC 的题目(待补)

D. Genealogy in the trees

E. High contrast pattern

F. Jewel maximizing magic