https://ac.nowcoder.com/acm/contest/117763
E
在此题中,我们认为数组以从左到右的顺序排列。
对于一个数组 \(a\),小芳定义两个函数 \(L\left( a\right)\) 与 \(R\left( a\right)\) 为:
\(\hspace{23pt} \bullet\)\(L\left(a \right)\):数组中所有满足“大于其左侧所有数”的数之和。
\(\hspace{23pt} \bullet\)\(R\left(a \right)\):数组中所有满足“大于其右侧所有数”的数之和。
如,设一个数组 \(b = \{2,3,4,3,5,1\}\),则 \(L\left( b\right) = 2+3+4+5 =14\),\(R\left(b\right) = 1+5=6\)。
小芳希望小红构造一个长为 \(n\) 的排列 \(c\),使得 \(L\left(c\right)+R\left(c\right)=k\)。请你帮帮小红。
也就是说大概是这样的:
找到最高的位置,记为\(p\),那么\(L(a)\)也就等于\([1,p]\)单调增的所有数相加;\(R(a)\)等于\([p,n]\)从右向左单调增的所有数之和。由于答案要求我们构造一个长度为\(n\)的排列,因此\(n\)肯定会被计算两次,\(n-1\)会被计算一次,所以\(L(a)+R(a)\geq 3\times n-1\)。
考虑如何构造:不妨把\(n\)方在最后一个位置,\(n-1\)放在\(n\)前面的位置,然后将构造\(k\)需要的数按大到小放在\(n-1\)的前面,没有用到的数放在\(n-1\)和\(n\)的中间即可。对于从\([1,n-2]\)构造\(k-(3\times n-1)\),只需要贪心即可。
[code]void solve() { int n,k; cin >> n >> k; if(k((1+n)*n/2+n)){ cout =i){ vis=1; k-=i; } } if(k!=0){ cout |