33OJ
登录 注册

#P17684. [IO 2025 #2] 罗斯托夫的排列

    ID: 20332 远端评测题 2000ms 512MiB 尝试: 0 已通过: 0 显示难度普及+/提高− 上传者: 标签>2025Special Judge生成树连通块

[IO 2025 #2] 罗斯托夫的排列

题目描述

顿河畔罗斯托夫市的市政府决定整理顿河沿岸的景点列表。每个景点都有一个互不相同的编号(即它的评分),需要把景点按评分从小到大排列。

然而,移动景点并不容易!只有在技术上允许移动的两个位置之间,才能交换景点。这些允许交换的位置对由城市的基础设施网络决定。

形式化地,给定一个由 nn 个互不相同的整数组成的数组 aa。只有当位置对 (i,j)(i,j) 出现在允许交换的位置对列表中时,才能执行交换操作 swap,交换 aia_i 与 aja_j。

请判断能否仅通过这些允许的交换,把数组按从小到大排序。如果可以,还需要给出一组符合下述输出限制的交换操作;不要求操作次数最少。

输入格式

第一行包含一个整数 nn(1≤n≤20001\le n\le2000),表示景点数量。

第二行包含 nn 个互不相同的整数 a1,a2,…,ana_1,a_2,\ldots,a_n(1≤ai≤1091\le a_i\le10^9),表示景点的评分。

第三行包含一个整数 mm(0≤m≤n(n−1)20\le m\le\frac{n(n-1)}2),表示允许交换的位置对数量。

接下来 mm 行,每行包含两个整数 ui,viu_i,v_i(1≤ui,vi≤n1\le u_i,v_i\le n,ui≠viu_i\ne v_i),表示可以交换位置 uiu_i 与 viv_i 上的景点。

位置对是无向的:(u,v)(u,v) 与 (v,u)(v,u) 表示相同的交换。

输出格式

如果能够仅使用允许的交换把数组按评分从小到大排序,输出 YES;否则输出 NO。

如果输出 YES,在下一行输出操作次数 qq(0≤q≤4⋅1060\le q\le4\cdot10^6),然后在下一行输出 qq 个整数,依次表示执行的交换操作编号。一个操作编号对应输入中的一对允许交换的位置;这些位置对按输入顺序从 11 开始编号。如果 q=0q=0,操作列表为空。

5
3 1 2 5 4
3
1 2
2 3
4 5
YES
3
3 1 2
3
1 2 3
1
2 1
YES
0