原题链接:
https://vjudge.net/problem/CodeForces-1512E
AC代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef long long ll;
const int64_t mod = 1e9 + 7;
const int maxn = 1e6 + 10;
int a[maxn];
int vis[maxn];
int main() {
int t;
cin >> t;
while (t--) {
memset(vis, 0, sizeof(vis));
memset(a, 0, sizeof(a));
int n, l, r, s;
cin >> n >> l >> r >> s;
int len = r - l + 1;
int sum = 0;
for (int i = 1; i <= len; i++) {
sum += i;
}
if (sum > s) {
cout << "-1\n";
continue;
}
s -= sum;
int k = len;
while (len <= s) {
k++;
s -= len;
}
if ((k == n && s) || k > n) {
cout << "-1\n";
continue;
}
for (int i = r; i >= l; i--) {
if (s > 0) {
a[i] = k + 1;
} else {
a[i] = k;
}
vis[a[i]] = 1;
s--;
k--;
}
stack<int> b;
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
b.push(i);
}
}
for (int i = 1; i <= n; i++) {
if (!a[i]) {
a[i] = b.top();
b.pop();
}
}
for (int i = 1; i < n; i++) {
cout << a[i] << " ";
}
cout << a[n] << endl;
}
return 0;
}
大致思路就是首先判断【l,r】最小和sum=1+2+…+len(len=r-l+1)是不是大于s,如果是则直接输出-1;再判断s和sum的关系,逐步逼近s,满足条件则输出。