题解 CF1401C
题目大意:
给定一序列 \(A\),定义当且仅当 \(\gcd(a_i,a_j)=a_{min}\) 时,元素 \(a_i\) 和 \(a_j\) 可以交换。
问当前给定的序列 \(A\) 能否转化为非严格单调递增的序列。
题目分析:
因为两个元素当且仅当其最大公因数为 \(a_{min}\) 时才可以交换,故我们可以先对原序列进行排序,然后判断排序后的序列中原序列与之间的不同的元素能不能被 \(a_{min}\) 整除即可,理由如下:
首先,很显然的是,原命题等价于两个命题,分别是:
- 若排序后的序列中与原序列之间不同的元素不能被 \(a_{min}\) 整除,则原序列必定无法转化为一个非严格单调递增的序列
- 若排序后的序列中与原序列之间的每一个不同的元素能被 \(a_{min}\) 整除,则原序列必定可以转化为一个非严格单调递增的序列。
现在,我们对命题 \(1\) 进行证明:
因为其为排序后的序列,故其与原序列不同的元素必然是那些发生了交换的元素。
如果那些发生了交换的元素不能被最小值 \(a_{min}\) 整除,则证明该元素中不完全包含 \(a_{min}\) 所含有的因子,故其与其他数的最大公因数必然不是\(a_{min}\),其显然无法完成交换操作,与前面相矛盾,所以无法完成转化操作。
现在,我们对命题 \(2\) 进行证明:
若每两个不同的元素之间的最大公因数为 \(a_{min}\),则其能转化为目标序列是显然的,这里不多赘述。
若有两个不同的元素之间的最大公因数不为 \(a_{min}\),那么这两个数要么可以通过其他与之最大公因数为 \(\boldsymbol{a_{min}}\) 的间接交换而来,要么直接和 \(a_{min}\) 间接交换而来。
综上,我们不难证明这个方法是正确的。时间复杂度取决于排序,这里我用的是快排,故时间复杂度为 \(O(n\lg n)\)
代码实现:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define TIME_LIMIT (time_t)2e3
#define dbg(x) cerr<<#x<<": "<<x<<endl;
#define MAX_SIZE (int)1.1e5
signed main() {
ios::sync_with_stdio(false);
#ifdef LOCAL
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
time_t cs = clock();
#endif
//========================================
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
int a[MAX_SIZE] = {};
int bak[MAX_SIZE] = {};
for (int i = 1; i <= n; i++) {
cin >> a[i];
bak[i] = a[i];
}
sort(a + 1, a + 1 + n);
bool flag = 0;
for (int i = 1; i <= n; i++) {
if (a[i] != bak[i] && a[i] % a[1] != 0) {
cout << "NO" << endl;
flag = 1;
break;
}
}
if (!flag)
cout << "YES" << endl;
}
//========================================
#ifdef LOCAL
fclose(stdin);
fclose(stdout);
time_t ce = clock();
cerr << "Used Time: " << ce - cs << " ms." << endl;
if (TIME_LIMIT < ce - cs)
cerr << "Warning!! Time exceeded limit!!" << endl;
#endif
return 0;
}
题解 CF1401C的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- Java并发篇:6个必备的Java并发面试种子题目
线程创建和生命周期 线程的创建和生命周期涉及到线程的产生.执行和结束过程.让我们继续深入探索这个主题: 线程的创建方式有多种,你可以选择适合你场景的方式: 继承Thread类: 创建一个类,继承自Th ...
- Linux 文件系统的设计
一 硬盘的最小存储单元是扇区,扇区大小为512B 文件系统将硬盘划分为固定大小的块(block),最常见的块大小为4KB 块是文件系统读写硬盘的最小单位 二 文件系统设计面临的基本问题: 用户怎么找到 ...
- JS优化技巧,解决冗余代码
1. 使用箭头函数简化函数定义 // 传统函数定义 function add(a, b) { return a + b; } // 箭头函数简化 const add = (a, b) => a ...
- C#系统锁屏事件例子 - 开源研究系列文章
今天有个网友问了个关于操作系统锁屏的问题. 我们知道,操作系统是基于消息和事件处理的,所以我们只要找到该操作系统锁屏和解屏的那个事件,然后在事件里进行处理即可.下面是例子介绍. 1. 项目目录: 下面 ...
- PIP升级+安装Django命令[WARNING: Retrying (Retry(total=4, connect=None...]
升级: >pip install -U Django 安装: >pip install Django 如果发现超时错误内容:(WARNING: Retrying (Retry(total= ...
- 微信小程序上传文件操作示范
社会实践心得体会格式要求 提交的心得体会应为word文档,且图文并茂,全文段前.段后0,1.5倍行距. 题目:自拟,方正小标宋简体,小二号,加粗,居中. 个人信息:题目下方,宋体,小四号,加粗,居中, ...
- 《SQL与数据库基础》19. 日志
目录 日志 错误日志 二进制日志 日志格式 日志查看 日志删除 查询日志 慢查询日志 本文以 MySQL 为例 日志 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysql 启动 ...
- 云原生 | 企业内使用 CoreDNS 构建高性能、插件化的DNS服务器
[点击 关注「 全栈工程师修炼指南」公众号 ] 设为「️ 星标」带你从基础入门 到 全栈实践 再到 放弃学习! 涉及 网络安全运维.应用开发.物联网IOT.学习路径 .个人感悟 等知识分享. 希望各位 ...
- QA|4个数据打开了4个页面,怎么实现只打开一个页面?单例模式|网页计算器自动化测试实战
如下图,代码中4个数据,产生了4个页面,怎么实现只打开一个页面?可使用单例模式 查询得知 单例模式实现有5种方法,参照链接下: https://blog.csdn.net/SixStar_FL/art ...
- 「codeforces - 1633F」Perfect Matching
link. 首先所有的 activated nodes 组合成了一棵以 \(1\) 为根的有根树.询问即求由 activated nodes 组成的树的最大匹配.对于树上最大匹配有一个贪心策略:自底向 ...