B. Repetitions Decoding 题解(思维+构造)
题目链接
题目思路
如果所有元素出现都是偶数次,那么就有办法,否则就没有办法
这个题目感觉构造方法不是很难想
就是每次假设出现了
那么每次消去两个然后中间的字符翻转
如何写很巧妙,我是参考一位大佬的代码
采用从后往前遍历,因为如果从前往后很麻烦
具体实现看代码
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n;
int a[maxn];
int tmp[maxn];
signed main(){
int _;scanf("%d",&_);
while(_--){
map<int,int> cnt;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
cnt[a[i]]++;
}
bool flag=0;
for(auto x:cnt){
if(x.se%2==1){
flag=1;
break;
}
}
if(flag){
printf("-1\n");
continue;
}
vector<int> ans1;
vector<pair<int,int> > ans2;
for(int i=n;i>=1;i-=2){
int j=i-1;
while(j>=1&&a[j]!=a[i]){
j--;
}
int p=j-1;
ans1.push_back(2*(i-j));
for(int k=i-1;k>=j+1;k--){
ans2.push_back({p,a[k]});
p++;
tmp[p]=a[k];
}
for(int k=j;k<=i-2;k++){
a[k]=tmp[k];
}
}
printf("%d\n",ans2.size());
for(auto x:ans2){
printf("%d %d\n",x.fi,x.se);
}
printf("%d\n",ans1.size());
reverse(ans1.begin(),ans1.end());
for(auto x:ans1){
printf("%d ",x);
}
printf("\n");
}
return 0;
}
不摆烂了,写题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)