尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

[ARC198C] Error Swap

[ARC198C] Error Swap
📅 发布时间:2026/6/19 0:40:17

题目传送门

构造

题意

给定长度为 $ N $ 的两个整数序列 $ A=(A_1,A_2,\dots,A_N) $ 和 $ B=(B_1,B_2,\dots,B_N) $。

你可以执行以下操作最多 $ 31000 $ 次:

  • 选择满足 \(1 \le i < j \le N\) 的整数对 \((i,j)\),并将 \(A_i\) 替换为 \(A_j - 1\),\(A_j\) 替换为 \(A_i + 1\)。

你的目标是使 \(A = B\)。判断目标是否可以实现,如果可以实现,请输出一个满足条件的操作序列。

题解

这种题都是都需要套路地将题目给出的操作组合成一种容易维护的操作。

设题目给定的操作为 \(opt(i,j): (A_i,A_j) \rightarrow (A_j-1,A_i+1)\)。

发现只对 \(2\) 个元素操作只能得出有且仅有的另一种状态,所以我们考虑一种对三元组的操作,经过手玩可以总结出下面几个操作:

  • \((A_i,A_j) \rightarrow (A_i-1,A_j+1)\)
    • \(j \neq n\):\(opt(j,j+1) \rightarrow opt(i,j+1) \rightarrow opt(j,j+1) \rightarrow opt(i,j)\),命名为操作 \(\alpha(i,j)\)。
    • \(i \neq 1\):\(opt(i-1,i) \rightarrow opt(i-1,j) \rightarrow opt(i-1,i) \rightarrow opt(i,j)\),命名为操作 \(\beta(i,j)\)。
    • \(i=1,j=n\):\(\alpha(i,j-1)\rightarrow\beta(j-1,j)\),命名为操作 \(\gamma(i,j)\)。
  • \((A_i,A_j) \rightarrow (A_i+1,A_j-1)\):就是上一种操作的逆向操作。

我们有了上面两种操作,就可以随便做这道题目了。

令 \(C_i=A_i-B_i\),则我们枚举每一个 \(C_i\),并枚举 \(C_j(i<j)\) 去跟 \(C_i\) 匹配,能消就消掉。

下面证明总操作次数是小于 \(31000\) 的,对于操作 \(\gamma\) 最多只会进行 \(N\) 次,不考虑,对于操作 \(\alpha,\beta\),单次操作需要消耗 \(4\) 个次数,最多进行 \(O(\frac N 2 \times \frac N 2) 次\),最大次数约等于 \(10000\) 次,可以通过。

代码

#include <bits/stdc++.h>
using namespace std;const int N=105;
const int LIMIT=31000; 
int n,m;
int aa[N],a[N],b[N],c[LIMIT<<1],d[LIMIT<<1];// (i, j) -> (j - 1, i + 1)
inline void opt(int i,int j){// cout<<i<<" "<<j<<"\n";c[++m]=i,d[m]=j;swap(a[i],a[j]);a[i]--,a[j]++;
}// (i, j) -> (i - 1, j + 1)
// j != n, cost : 4
inline void change1(int i,int j){opt(j,j+1);opt(i,j+1);opt(j,j+1);opt(i,j);
}
// i != 1, cost : 4
inline void change2(int i,int j){opt(i-1,i);opt(i-1,j);opt(i-1,i);opt(i,j);
}// i = 1, j = n, cost : 8
inline void change3(int i,int j){change1(i,j-1);change2(j-1,j);
}// (i, j) -> (i + 1, j - 1)
// j != n, cost : 4
inline void change4(int i,int j){opt(i,j);opt(j,j+1);opt(i,j+1);opt(j,j+1);
}// i != 1, cost : 4
inline void change5(int i,int j){opt(i,j);opt(i-1,i);opt(i-1,j);opt(i-1,i);
}// i = 1, j = n, cost : 8
inline void change6(int i,int j){change5(j-1,j);change4(i,j-1);
}inline void in1(int i,int j){if(j!=n) change1(i,j);else if(i!=1) change2(i,j);else change3(i,j);
}inline void in2(int i,int j){if(j!=n) change4(i,j);else if(i!=1) change5(i,j);else change6(i,j);
}inline void output(){assert(m<=LIMIT);cout<<"Yes\n";cout<<m<<"\n";for(int i=1;i<=m;i++) cout<<c[i]<<" "<<d[i]<<"\n";
}int main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++) cin>>aa[i];int sum=0;for(int i=1;i<=n;i++) cin>>b[i],a[i]=aa[i]-b[i],sum+=a[i];if(sum){cout<<"No\n";return 0;}if(n==2){if(a[1]==0&&a[2]==0) output();else if(aa[1]+1==b[2]&&aa[2]-1==b[1]){//这里的特判要注意不能用下面的change操作的标准,因为只有两个数不合法。opt(1,2);output();}else cout<<"No\n";return 0;}for(int i=1;i<=n;i++){if(!a[i]) continue;if(a[i]>0){for(int j=i+1;j<=n;j++) while(a[i]>0&&a[j]<0) in1(i,j);}else{for(int j=i+1;j<=n;j++) while(a[i]<0&&a[j]>0) in2(i,j);} }output();return 0;  
}

本文来自博客园,作者:_AzureSky,转载请注明原文链接:https://www.cnblogs.com/-AzureSky-/p/19088604

相关新闻

  • 向“光”而行 | 相聚2025 ASML中国日,携手奔赴“芯”辰大海
  • JavaDay3
  • U3D动作游戏开发读书笔记--2.2 编辑器本身的基础知识

最新新闻

  • 2026 武汉高考复读学校招生报名指南(最新) - 武汉中职最新信息发布
  • 5步轻松绕过Windows 11硬件限制:免费安装完整指南
  • 2026年停车场照明工程灯具品牌选择与应用解析 - 品牌排行榜
  • 2026年城阳区专业的地漏疏通公司怎么选 - 品牌排行榜
  • 2026甄选宁波本地AI营销公司口碑实力排行盘点 - 起跑123
  • Legacy iOS Kit:经典iOS设备降级与越狱的终极解决方案

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号