第一行输入两个正整数
。
第二行输入
个整数
。
如果不存在合法的
个区间,请输出
,否则对于构造的每个区间,新起一行依次输出
。
如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
5 5 1 2 3 4 5
1 5 2 5 3 5 4 5 5 5
5 2 1 2 1 2 1
-1
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] sp = br.readLine().split(" ");
int n = Integer.parseInt(sp[0]), m = Integer.parseInt(sp[1]);
int[] a = new int[n + 2];
long min = 0, max = 0; // 和可能很大, 先用Long计算, L、R后面再弄
sp = br.readLine().split(" ");
for (int i = 1; i <= n; i++) {
a[i] = Integer.parseInt(sp[i-1]);
min += Math.max(0, a[i] - a[i - 1]);
max += a[i];
}
if (m < min || m > max) { // m ∈ [min,max]
System.out.println(-1);
return;
}
List<Integer> L = new ArrayList<>();
List<Integer> R = new ArrayList<>();
for (int i = 1; i <= n + 1; i++) { // a[0]=a[n+1]=0:处理开头结尾
int d = a[i] - a[i - 1];
if (d > 0) {
while (d-- > 0) {
L.add(i);
}
} else {
d = -d;
while (d-- > 0) {
R.add(i - 1); // 结尾不包含i
}
}
}
int rest = m - (int)min; // 要额外凑的
StringBuilder sb = new StringBuilder();
for (int i = 0; i < min; i++) {
int l = L.get(i), r = R.get(i);
// 该区间[l,r]可以拆为r-l+1个点, 最多额外提供r-l个, 扣除区间本身1个🔥
int d = Math.min(rest, r - l);
rest -= d;
for (int j = l; j < l + d; j++) { // 1个点的区间:[j,j]
sb.append(j).append(' ').append(j).append('\n');
}
sb.append(l + d).append(' ').append(r).append('\n'); // 剩余:[l+d,r]
}
System.out.print(sb);
}
}