这是个贪心……
按照到1点的距离排个序,后面的点连在前面的点上,相同距离的点连在前面的同一个点上,若连起来的两点距离大于s,或某个不是1点到一点的距离相等,输出-1。
原因:
1.排序后,i点若不能连到i-1点,就肯定连不到i-2,i-3等点。而如果能连到,那我们为什么要去考虑前面的点?
2.边权W大于等于1,所以距离相同的点不能连在一起,但可以连在同一个其他距离的点上。
3.某不是1点距离为0的点,无法连在任意一点上,因为W大于等于1,而距离为0,小于Wmin。

#include<bits/stdc++.h>
using namespace std;
long long n,s,m=0,read();
struct node{long long num,lon;}a[50001];
struct nobe{long long l,r,len;}b[50001];
bool cmp(node,node);
int main()
{
    n=read(),s=read();
    for(register int i=1;i<=n;++i)
        a[i].num=i,a[i].lon=read();
    sort(a+1,a+n+1,cmp);
    for(register int i=2;i<=n;++i)
    {
        if(a[i].lon!=0)
        {
            if(a[i].lon-a[i-1].lon>s)
            {printf("-1\n");return 0;}
            else
            {
                if(a[i-1].lon!=a[i].lon)
                {
                    m+=1;
                    b[m].l=a[i-1].num;
                    b[m].r=a[i].num;
                    b[m].len=a[i].lon-a[i-1].lon;
                }
                else
                {
                    m+=1;
                    b[m].l=b[m-1].l;
                    b[m].r=a[i].num;
                    b[m].len=b[m-1].len;
                }
            }
        }
        else{printf("-1\n");return 0;}
    }
    if(m>100000){printf("-1\n");return 0;}
    printf("%lld\n",m);
    for(register int i=1;i<=m;++i)
        printf("%lld %lld %lld\n",b[i].l,b[i].r,b[i].len);
    return 0;
}
bool cmp(node o,node p)
{
    if(o.lon!=p.lon) return o.lon<p.lon;
    else return o.num<p.num;
}
long long read()
{
    long long o=0;
    char c=getchar();
    while(c<='9'&&c>='0') {o=o*10+c-'0';c=getchar();}
    return o;
}