Codeforces 1197 简要题解

文章目录

比赛传送门

A题

传送门
排个序然后取 a [ n − 1 ] − 1 a[n-1]-1 a[n1]1 n − 2 n-2 n2的最小值。
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
inline int read(){
   
	#define gc getchar
	int ans=0;
	bool f=1;
	char ch=gc();
	while(!isdigit(ch))f^=ch=='-',ch=gc();
	while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
	return f?ans:-ans;
}
typedef pair<int,int> pii;
typedef long long ll;
const int mod=998244353;
inline int add(const int&a,const int&b){
   return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){
   return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){
   return (ll)a*b%mod;}
inline void Add(int&a,const int&b){
   a=a+b>=mod?a+b-mod:a+b;}
inline void Dec(int&a,const int&b){
   a=a>=b?a-b:a-b+mod;}
inline void Mul(int&a,const int&b){
   a=(ll)a*b%mod;}
inline int ksm(int a,int p){
   int ret=1;for(;p;p>>=1,a=mul(a,a))if(p&1)Mul(ret,a);return ret;}
const int N=2e5+5;
int n,a[N];
int main(){
   
	for(ri tt=read();tt;--tt){
   
		n=read();
		for(ri i=1;i<=n;++i)a[i]=read();
		sort(a+1,a+n+1);
		cout<<min(n-2,a[n-1]-1)<<'\n';
	}
	return 0;
} 

B题

传送门
随便写个双向链表然后按照题意模拟。
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
inline int read(){
   
	#define gc getchar
	int ans=0;
	bool f=1;
	char ch=gc();
	while(!isdigit(ch))f^=ch=='-',ch=gc();
	while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
	return f?ans:-ans;
}
typedef pair<int,int> pii;
typedef long long ll;
const int mod=998244353;
inline int add(const int&a,const int&b){
   return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){
   return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){
   return (ll)a*b%mod;}
inline void Add(int&a,const int&b){
   a=a+b>=mod?a+b-mod:a+b;}
inline void Dec(int&a,const int&b){
   a=a>=b?a-b:a-b+mod;}
inline void Mul(int&a,const int&b){
   a=(ll)a*b%mod;}
inline int ksm(int a,int p){
   int ret=1;for(;p;p>>=1,a=mul(a,a))if(p&1)Mul(ret,a);return ret;}
const int N=2e5+5;
int n,a[N],pos[N],pre[N],suf[N];
int main(){
   
	n=read();
	for(ri i=1;i<=n;++i)a[i]=read(),pos[a[i]]=i;
	for(ri i=1;i<=n;++i)pre[a[i]]=a[i-1],suf[a[i]]=a[i+1];
	pre[0]=a[1],suf[n+1]=a[n];
	int t;
	for(t=n;t;--t){
   
		if(pre[t]!=t-1&&suf[t]!=t-1)break;
		suf[pre[t]]=suf[t];
		pre[suf[t]]=pre[t];
	}
	if(t>1)puts("No");
	else puts("Yes");
	return 0;
} 

C题

传送门
考虑转化问题。
变成求 a i − a i − 1 a_i-a_{i-1} aiai1的前 k − 1 k-1 k1大值,然后用 a n − a 1 a_n-a_1 ana1减去它们的和即可。
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
inline int read(){
   
	#define gc getchar
	int ans=0;
	bool f=1;
	char ch=gc();
	while(!isdigit(ch))f^=ch=='-',ch=gc();
	while(isdigit(ch))ans=((ans<<2)+ans<<1
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值