一种构造法,居然过了?
CF1355D
现在我们已知要构造一个长度为
解法说明
观察
首先我们造一些样例,观察一下性质:
试图:
然后考虑它子串的可能获得的所有和。
很不幸,从
再写一个试试:
然后考虑它子串的可能获得的所有和。
找
发现因为再求子串和的时候,我们是对数列中的元素求所有组合情况,而数列一堆
贪心
这时,我们便有一种贪心的猜想:让数列中出现的不同元素尽可能的少。所以能不能构造数列
值得顾虑的是,“
读者自证不难。
细化
推广开,不同元素只有两个,
通过组合,子串和覆盖的范围就会是
然后,居然过了?
Code
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n, s;
cin >> n >> s;
int x = s - (n - 1);
if (x > n) {
cout << "YES" << endl;
for (int i = 1;i <= n - 1;i++) cout << 1 << ' ';
cout << x << endl << n;
return;
}
cout << "NO";
}
int main() {
// freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
int T = 1;
while (T--) solve();
return 0;
}