首页 > 其他分享 >AGC063C Add Mod Operations

AGC063C Add Mod Operations

时间:2023-07-31 13:45:15浏览次数:40  
标签:Operations le val int LL long Add AGC063C ord

感觉是非常纯的思维题。

题意

给两个长度为 \(n\) 的序列 \(A, B\)。你可以对 \(A\) 做不超过 \(n\) 次操作,形如对于所有元素,先加上 \(x\) 再对 \(y\) 取模。其中 \(0\le x < y\le 10^{18}\) 是由你决定的任意整数。给出一种方案将 \(A\) 变成 \(B\),或声明无解。

\(1\le n \le 2000, 0\le A_i, B_i \le 10^9\)。

题解

发现取模这个操作可以只作用于比较大的数,那么考虑能不能每次只操作最大的数。发现对于最大的数的操作其实也有一些限制,那么直接考虑一个比较极端的情况:每次都把最大的数变成 \(0\)。那么再结合加 \(x\) 这个操作,其实相当于把整个序列向右移动一些距离,然后把最后一个数放到原点上。那么通过 \(n - 1\) 次操作,我们可以控制任意两个数之间的距离,但是不能改变它们的相对位置。考虑通过最后一次操作,把所有数赋予正确的值。这要求原先的数值大小关系丧失掉,所以考虑利用取模。具体地,设一个极大数 \(R\),然后令第一个数的目标是 \(0\),第二个数的目标是 \(B_2 - B_1 + R\),第三个数是 \(B_3 - B_1 + 2R\),以此类推,这样可以让原序列的顺序得以保持,而只需要在最后进行加 \(B_1\),模 \(R\) 的操作即可一次性处理所有数。

代码

// Author: kyEEcccccc

#include <bits/stdc++.h>

using namespace std;

using LL = long long;
using ULL = unsigned long long;

#define F(i, l, r) for (int i = (l); i <= (r); ++i)
#define FF(i, r, l) for (int i = (r); i >= (l); --i)
#define MAX(a, b) ((a) = max(a, b))
#define MIN(a, b) ((a) = min(a, b))
#define SZ(a) ((int)((a).size()) - 1)

constexpr int N = 1005;
constexpr LL R = 2000000000;

int n;
LL a[N], b[N];
int ord[N];

LL calc_val(int i)
{
	return b[ord[i]] + R * ((i - 2 + n) % n);
}

signed main(void)
{
	// freopen(".in", "r", stdin);
	// freopen(".out", "w", stdout);
	ios::sync_with_stdio(0), cin.tie(nullptr);

	cin >> n;
	F(i, 1, n) cin >> a[i];
	F(i, 1, n) cin >> b[i];

	iota(ord + 1, ord + n + 1, 1);
	sort(ord + 1, ord + n + 1, [] (int x, int y)
		{ return a[x] < a[y]; });
	bool ok = false;
	F(i, 2, n)
	{
		if (a[ord[i]] == a[ord[i - 1]] && b[ord[i]] != b[ord[i - 1]])
		{
			cout << "No\n";
			return 0;
		}
		if (a[ord[i]] != a[ord[i - 1]]) ok = true;
	}

	if (!ok)
	{
		cout << "Yes\n";
		cout << "1\n";
		if (a[1] > b[1]) cout << R - a[1] << ' ' << R - b[1] << '\n';
		else cout << b[1] - a[1] << ' ' << R << '\n';
		return 0;
	}

	vector<pair<LL, LL>> ans;
	LL sum = 0;
	FF(i, n, 2)
	{
		if (i != n && a[ord[i]] == a[ord[i + 1]]) continue;
		LL x = calc_val(i % n + 1) - calc_val(i);
		if (i == n) x -= a[ord[1]];
		sum += x;
		ans.push_back({x, a[ord[i]] + sum});
	}
	ans.push_back({calc_val(2), R});
	
	cout << "Yes\n";
	cout << ans.size() << '\n';
	for (auto xy : ans) cout << xy.first << ' ' << xy.second << '\n';
	
	return 0;
}

标签:Operations,le,val,int,LL,long,Add,AGC063C,ord
From: https://www.cnblogs.com/kyeecccccc/p/17593184.html

相关文章

  • mongodb 数组文档 addtoset
    MongoDB数组文档addtoset在MongoDB中,数组文档是一种非常有用的数据结构,它可以在一个文档中存储多个值,并且可以非常灵活地对其进行添加、更新和删除操作。其中一个常用的数组操作是addtoset,它用于向数组文档中添加新的元素。数组文档简介在MongoDB中,数组文档是一种嵌套在......
  • python 安装paddle
    如何安装PaddlePaddle作为一名经验丰富的开发者,我将向你介绍如何安装PaddlePaddle,一个强大的Python深度学习框架。PaddlePaddle为开发者提供了丰富的工具和库,帮助他们构建和训练深度学习模型。安装步骤下面是安装PaddlePaddle的步骤,我将用一个表格展示每个步骤的概要。步骤......
  • 高精度离线免费 的C#文字识别PaddleOCR库
    随便打开一个MicrosoftVisualStudio,新建一个WinForms项目,从下面列表中随便选择一个NET框架。目标平台要设置成X64,该OCR仅支持64位。 123net35;net40;net45;net451;net452;net46;net461;net462;net47;net471;net472;net48;netstandard2.0;netcoreapp3.1;net5.0......
  • Sprite padding, innerUV, outerUV的解释
    1)Rectrect;SpriteMode为Single时:x,y总是为0;width,height为裁掉空白像素前的大小2)Vector2textureRectOffset;左下角裁掉了多少空白像素3)RecttextureRect;x,y为Sprite左下角的坐标(图集左下角为原点);width,height为裁掉空白像素后的大小4)Vector4paddin......
  • 算法编程中的Word 四兄弟 Word Break , Word Ladder, Word Search, Word Pattern
    Word四兄弟WordBreak,WordLadder,WordSearch,WordPattern,太容易出现了,针对性分析下。  829·字模式II算法困难通过率47% 描述给定一个pattern和一个字符串str,查找str是否遵循相同的模式。这里遵循的意思是一个完整的匹配,在一个字母的模式和一个非空的单词str之间......
  • Centos7如何配置IPADDR,NETMASK,GATEWAY?
    1、获取IPADDR、NETMASK:[root@192network-scripts]#ifconfigens33:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500inet192.168.85.139netmask255.255.255.0broadcast192.168.85.255inet6fe80::11df:c601:5b38:ca41prefixlen64s......
  • Error: listen EADDRINUSE: address already in use 127.0.0.1:8888
    编译打包报错,Error:listenEADDRINUSE:addressalreadyinuse127.0.0.1:8888查询原因是端口被占用,关闭占用的端口号即可。具体怎么关闭端口,可以参考网上其他资料:https://blog.csdn.net/m0_55930697/article/details/118026084......
  • 模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别
    目录流程版本安装Docker安装PaddleNLP安装环境准备模型准备压缩模型下载模型模型部署环境配置启动服务测试--暂时还没通过重启图像识别+信息抽取(UIE-X),部署接口供别的应用调用最终在自己部署的环境中识别时报错,不知道是不是和GPU有关,还在尝试中流程在百度BMLCodeLab......
  • PaddleSharp:跨越一年的版本更新与亮点
    PaddleSharp:跨越一年的版本更新与亮点我始终坚信,开源社区是技术进步的重要推动力,也是我抽出我业余时间,投入到PaddleSharp这个项目的原因,这个项目充分展现了.NET在复杂计算领域的潜力。今天很高兴地告诉大家,PaddleSharp有了新版本!先来说说背景,有的朋友可能知道,PaddleSharp过去老......
  • git config --global --add safe.directory
     克隆下源码对其操作时git报错fatal:unsaferepository并提示可以:gitconfig--global--addsafe.directory这个命令是用来将一个安全目录添加到全局的Git配置中。具体来说,它会在Git的配置文件中添加一行类似于"safe.directory=/path/to/directory"的配置项,表示......