#D1012. 度数谜题

度数谜题

题目描述

33DAI 要给 nn 个村庄修路,编号从 11 到 nn。他希望第 ii 个村庄恰好与 did_i 个其他村庄之间各修一条路。

修路有以下限制:

  • 每一条路连接两个不同的村庄;
  • 任意两个村庄之间至多修一条路(不能有重边)。

33DAI 想知道:是否存在一种修路方案?如果存在,请输出任意一种。

输入格式

第一行一个整数 nn。

第二行 nn 个整数 d1,d2,…,dnd_1, d_2, \dots, d_n,相邻两个整数之间用一个空格隔开。

输出格式

如果不存在方案,输出一行 NO。

如果存在方案,第一行输出 YES,第二行输出一个整数 mm,表示修的道路条数;接下来 mm 行,每行两个整数 u,vu, v,表示在 uu 号村庄与 vv 号村庄之间修一条路。

4
3 3 0 0
NO

样例 1 解释

11 号和 22 号村庄的度数都是 33,说明它们都要和其余所有村庄相连,于是 33 号、44 号村庄至少各有一条路;但题目给出的 d3=d4=0d_3 = d_4 = 0,矛盾,所以不存在方案,输出 NO。

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

样例 2 解释

这 55 条路首尾相接围成一个环,每个村庄恰好与两个村庄相连,满足 di=2d_i = 2,所以是一种合法方案。

样例 3

见 deg3.in 与 deg3.ans。

样例 4

见 deg4.in 与 deg4.ans。

数据范围

对于全部测试数据,保证:

  • 1≤n≤20001 \le n \le 2000;
  • 0≤di≤n−10 \le d_i \le n - 1。

提示

本题答案不唯一:只要输出的图满足"没有自环、没有重边,且第 ii 个点的度数恰好为 did_i"即可。评测使用 Special Judge。

子任务

本题共 20 个测试点,按测试点计分:

测试点 分值 每个测试点 特殊限制
1∼61 \sim 6 3030 55 n≤8n \le 8
7∼127 \sim 12 n≤200n \le 200
13∼2013 \sim 20 4040 无额外限制

每个测试点单独评分,全部测试点的得分之和即为本题得分。