https://codeforces.com/contest/1512/problem/E
没观察出sum是可以不断+1连续构造的,最小值到最大值之间全部能构造,我这也太菜了,已经菜到div3两题不会做了,马上表演ec原地爆炸了,草啊
先让k=r-l+1,然后让l,r为1-k,然后从a[r]开始让他逐渐增大,变成n,然后再让a[r-1]逐渐增大,这样递增每次都是1的,也就是最小值到最大值中间每个值都能构造
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=510;
int n,l,r,s,k,up,len,ans;
int a[maxl];
bool vis[maxl];
inline void prework()
{
scanf("%d%d%d%d",&n,&l,&r,&s);
k=r-l+1;
for(int i=1;i<=n;i++)
vis[i]=false;
}
inline void mainwork()
{
int sum=0;
for(int i=l;i<=r;i++)
a[i]=i-l+1,sum+=i-l+1,vis[a[i]]=true;
for(int i=r;i>=l;i--)
{
while(sum<s)
{
if(a[i]+1>n || vis[a[i]+1])
break;
vis[a[i]]=false;vis[a[i]+1]=true;
sum++;a[i]=a[i]+1;
}
}
ans=-1;
if(sum!=s)
return;
ans=1;
int id=1;
for(int i=1;i<=n;i++)
if(i<l || i>r)
{
while(vis[id]) id++;
a[i]=id;vis[id]=true;
}
}
inline void print()
{
if(ans<0)
puts("-1");
else
for(int i=1;i<=n;i++)
printf("%d%c",a[i]," \n"[i==n]);
}
int main()
{
int t=1;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}