把我CPU干烧了结果难度只有1500....
还是练的太少,五月份开始练思维!
思路:
要保证k个子串它们的和是正数,考虑构造一个有序序列,将正数放前面,负数放后面
因为要k个子串,因此求最大的满足k*(k+1)/2<=n的k作为正数个数,特殊地,这里的正数取1,然后剩下的数取-1000
但是有可能不能刚好凑成k*(k+1)/2个区间其区间和为正数,因此需要修改一下来产生额外的贡献
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=3e5+10;
int N,K;
void solve(){
cin>>N>>K;
vector<int> a(N,-1000);
int x=0;
while((x+1)*(x+2)/2<=K) x++;
for(int i=0;i<x;i++) a[i]=1;
K-=x*(x+1)/2;
if(K){
a[x]=K-x-1;
a[K-1]=500;
}
for(int i=0;i<a.size();i++) cout<<a[i]<<" \n"[i==a.size()-1];
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}