Graph constructive problems are back! This time the graph you are asked to build should match the following properties.

The graph is connected if and only if there exists a path between every pair of vertices.

The diameter (aka "longest shortest path") of a connected undirected graph is the maximum number of edges in the shortest path between any pair of its vertices.

The degree of a vertex is the number of edges incident to it.

Given a sequence of n n integers a 1 ,a 2 ,…,a n  a1,a2,…,an construct a connected undirected graph of n n vertices such that:

  • the graph contains no self-loops and no multiple edges;
  • the degree d i  di of the i i -th vertex doesn't exceed a i  ai (i.e. d i ≤a i  di≤ai );
  • the diameter of the graph is maximum possible.

Output the resulting graph or report that no solution exists.

Input

The first line contains a single integer n n (3≤n≤500 3≤n≤500 ) — the number of vertices in the graph.

The second line contains n n integers a 1 ,a 2 ,…,a n  a1,a2,…,an (1≤a i ≤n−1 1≤ai≤n−1 ) — the upper limits to vertex degrees.

Output

Print "NO" if no graph can be constructed under the given conditions.

Otherwise print "YES" and the diameter of the resulting graph in the first line.

The second line should contain a single integer m m — the number of edges in the resulting graph.

The i i -th of the next m m lines should contain two integers v i ,u i  vi,ui (1≤v i ,u i ≤n 1≤vi,ui≤n , v i ≠u i  vi≠ui ) — the description of the i i -th edge. The graph should contain no multiple edges — for each pair (x,y) (x,y) you output, you should output no more pairs (x,y) (x,y) or (y,x) (y,x) .

Examples

Input
3
2 2 2
Output
YES 2
2
1 2
2 3
Input
5
1 4 1 1 1
Output
YES 2
4
1 2
3 2
4 2
5 2
Input
3
1 1 1
Output
NO

题意:构造一棵树,使得直径最长,需要满足每个点的度数di<=ai。

思路:我们选择ai最小的两个最为直径端点,然后把di>1的加到直径上去,剩下的度数为1的加到直径的枝桠上。

昨天没时间了没有写输出“NO”,WA3了。今天加上了就AC了。

给我30s可能就A了,加上最后一题水题没做。这一次CF血亏。

#include<bits/stdc++.h>
#define pii pair<int,int>
#define F first
#define S second
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int N,sum,L,S,T;
int b[maxn],ans; int f[maxn],c[maxn],tot;
pii a[maxn];
int main()
{
scanf("%d",&N); ans=;
rep(i,,N) scanf("%d",&a[i].F),a[i].S=i;
sort(a+,a+N+);
b[++L]=a[].S; b[++L]=a[].S;
int pre=b[],bg=;
rep(i,,N){
if(a[i].F>){
f[++tot]=pre,c[tot]=a[i].S,pre=a[i].S,ans++;
if(!bg) bg=i;
}
}
f[++tot]=pre,c[tot]=b[];
int pos=bg,F=true;
rep(i,,bg-) {
if(a[i].F==) {
while(a[pos].F<=){
pos++; if(pos==N+) {F=false; break;}
}
if(!F) break;
a[pos].F--; f[++tot]=a[i].S,c[tot]=a[pos].S;
}
else break;
}
if(!F||tot!=N-) puts("NO");
else {
printf("YES %d\n%d\n",ans,N-);
rep(i,,tot) printf("%d %d\n",f[i],c[i]);
}
return ; }

CF1082D:Maximum Diameter Graph (简单构造)的更多相关文章

  1. cf1082D Maximum Diameter Graph(构造+模拟+细节)

    QWQ不得不说 \(cf\)的\(edu\ round\)出这种东西 有点太恶心了 题目大意:给你\(n\)个点,告诉你每个点的最大度数值(也就是说你的度数要小于等于这个),让你构造一个无向图,使其满 ...

  2. [CF1082D]Maximum Diameter Graph

    题目描述 Description Graph constructive problems are back! This time the graph you are asked to build sh ...

  3. Codeforces 1082D Maximum Diameter Graph (贪心构造)

    <题目链接> 题目大意:给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边. 解题分析:一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽 ...

  4. Educational Codeforces Round 55 (Rated for Div. 2) D. Maximum Diameter Graph (构造图)

    D. Maximum Diameter Graph time limit per test2 seconds memory limit per test256 megabytes inputstand ...

  5. Educational Codeforces Round 55 (Rated for Div. 2):D. Maximum Diameter Graph

    D. Maximum Diameter Graph 题目链接:https://codeforces.com/contest/1082/problem/D 题意: 给出n个点的最大入度数,要求添加边构成 ...

  6. D. Maximum Diameter Graph 贪心+图论+模拟

    题意:给出n个点的度数列 上限(实际点可以小于该度数列)问可以构造简单路最大长度是多少(n个点要连通 不能有平行边.重边) 思路:直接构造一条长链  先把度数为1的点 和度数大于1的点分开  先把度数 ...

  7. CodeForces 1082 D Maximum Diameter Graph

    题目传送门 题意:现在有n个点,每个点的度数最大为di,现在要求你构成一棵树,求直径最长. 题解:把所有度数为2的点先扣出来,这些就是这颗树的主干,也就是最长的距离. 然后我们把度数为2的点连起来,之 ...

  8. Codeforces 1082 D. Maximum Diameter Graph-树的直径-最长链-构造题 (Educational Codeforces Round 55 (Rated for Div. 2))

    D. Maximum Diameter Graph time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  9. CF1157D N Problems During K Days(简单构造)

    题目 题目 原数据是水成啥样了,\(<\longrightarrow <=,>=\longrightarrow <=,\)这也能过 被\(hack\)后身败名裂 做法 简单的贪 ...

随机推荐

  1. telnet到RedHat Linux失败--解决办法

    失败原因: 1.telnet包未安装,检查telnet包是否安装: [root@vm-rhel root]# rpm -qa telnet telnet-0.17-25 表示已安装 2.telnet包 ...

  2. Check out our list of adidas NMD Singapore retailers

    The adidas NMD Singapore is confirmed to produce on The month of january 14th at select adidas Origi ...

  3. 3.6 Templates -- Binding Element Class Names(绑定元素类名)

    1. 一个HTML元素的class属性可以像其他属性一样被绑定: <div class={{priority}}> Warning! </div> 生成的HTML <di ...

  4. 5.4 Components -- Wrapping Content in A Component(在组件中包裹内容)

    1.有时候,你可能希望定义一个模板,它包裹其他模板提供的内容. 例如,假设我们创建一个blog-post模板,我们可以使用它来展现一个blog post: app/components/blog-po ...

  5. 零碎收集cocos知识

    Configuration类 返回环境变量 local function menuCallback(tag, pSender) printInfo("selected item tag:%d ...

  6. hdu5072 容斥+枚举

    这题说的是给了 n 个数字 每个数值大于1 小于100000,n小于100000 ,找出满足下面要求的三人组有多少种 比如abc ( (ab)==(bc)==(ac) ==1 )||( (ab)!=1 ...

  7. myeclips破解

    MyEclipse官方安装文件,下载地址 http://www.jb51.net/softs/150886.html破解补丁http://www.jb51.net/softs/150887.html ...

  8. Python学习札记(二十八) 模块1

    参考:模块 NOTE 1.模块:一个.py文件称为一个模块. 2.代码模块化的意义:a.提升程序的可维护性 b.不用重复造轮子 3.避免模块冲突,解决方法:引入了按目录来组织模块的方法,称为包(Pac ...

  9. Mininet实验 自定义拓扑结构

    参考:MiniNet实验2 通过Mininet学习可视化操作,可以在界面上方便的构建拓扑结构. 最新的Mininet 2.2.0内置了一个mininet可视化工具miniedit.miniedit在/ ...

  10. LA 4253 箭术(二分枚举)

    https://vjudge.net/problem/UVALive-4253 题意: 有n个平行于x轴的线段,每条线段代表一个靶子.判断是否可以站在x轴上[0,W]区间内的某个位置射箭. 思路:二分 ...