CF1851D 题解
题意:
你的朋友有一个 n 个元素的数组,计算它的前缀和数组并传递给你,
在传递过程中不小心丢失了一个元素。
你的任务是找出给定的数组是否能匹配 1~n 的一个排列。
把数组差分一下,记录已经出现了
统计完后,扫一遍桶,找出出现次数为
注意特判。
代码:
#include<bits/stdc++.h>
#define ll long long
#define MAXN 200010
using namespace std;
ll read(){
char ch=getchar();
ll s=0, w=1;
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
ll a[MAXN];
ll b[MAXN];
bool vis[MAXN];
int main(){
ll T = read();
while(T--){
ll n;
n = read();
ll pos = 0;
for(ll i = 1; i <= 2 * n; i++){
vis[i] = false;
}
bool f = true;
for(ll i = 1; i <= n-1; i++){
a[i] = read();
}
for(ll i = 1; i <= n-1; i++){
if(a[i] > n * (n+1) / 2){
f = false;
break;
}
b[i] = a[i] - a[i-1];
if(vis[b[i]] || b[i] > n){
if(pos){
f = false;
break;
}
pos = b[i];
}
vis[b[i]] = true;
}
if(!f){
cout << "NO\n";
continue;
}
if(pos == 0){
cout << "YES\n";
continue;
}
ll pos1 = 0, pos2 = 0;
for(ll i = 1; i <= n; i++){
if(!vis[i]){
if(pos1 == 0){
pos1 = i;
}else{
pos2 = i;
}
}
}
cout << (pos1 + pos2 == pos ? "YES" : "NO") << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现