2025.2.10——1400
------------------------------------------------
A
- 入手点:发现
k
>
2
k>2
k>2 时答案为0。
- 关键点:考虑
k
=
=
1
/
k
=
=
2
k==1 / k==2
k==1/k==2 时即可。
- 巧妙点:
l
o
w
_
b
o
u
n
d
low\_bound
low_bound 去寻找第一个大于与小于指定值的数。
B
- 入手点:更换一种问题的计算方式,考虑一层层的后缀和。
- 关键点:正数求和。
- 对前缀和的理解。
C
- 入手:只需考虑最大值与最小值。
- 关键:每次操作会使差值/2。贪心奇偶数讨论一下即可。
D
- 关键:贪心单调匹配。
- 巧妙:使用结构体绑定下标排序,用于匹配。
------------------------代码------------------------
A
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, k;
cin >> n >> k;
vector<int> a(n);
int res = 1e18;
for (int i = 0; i < n; i++)
cin >> a[i], res = min(res, a[i]);
sort(a.begin(), a.end());
for (int i = 1; i < n; i++)
res = min(res, a[i] - a[i - 1]);
if (k == 2)
{
vector<int> inv = a;
reverse(inv.begin(), inv.end());
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
{
int v = abs(a[i] - a[j]);
auto it_r = lower_bound(begin(a), end(a), v);
auto it_l = lower_bound(begin(inv), end(inv), v, greater<int>());
if (it_r != end(a))
res = min(res, abs(*it_r - v));
if (it_l != end(inv))
res = min(res, abs(*it_l - v));
}
}
if (k > 2)
res = 0;
cout << res;
el;
}
B
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
vector<int> a(n + 1), suf(n + 2);
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = n; i; i--)
suf[i] = suf[i + 1] + a[i];
int res = suf[1];
for (int i = 2; i <= n; i++)
res += suf[i] > 0 ? suf[i] : 0;
cout << res;
el;
}
C
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
int l = 1e12, r = -1;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
l = min(l, x);
r = max(r, x);
}
vector<int> res;
while (l - r)
{
int v = l & 1 ? 1 : 0;
res.push_back(v);
l += v, r += v;
l >>= 1, r >>= 1;
}
cout << res.size();
el;
if (res.size() <= n)
for (auto v : res)
cout << v << ' ';
el;
}
D
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // attention: interactive/debug
#define el cout << endl
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
#define bugv(VEC) \
{ \
for (auto Vec : VEC) \
cout << Vec << ' '; \
el; \
}
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(10);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, k;
cin >> n >> k;
struct Node
{
/* data */
int v, id;
};
vector<Node> a(n), b(n);
for (int i = 0; i < n; i++)
cin >> a[i].v, a[i].id = i;
for (auto &[v, id] : b)
cin >> v;
sort(begin(a), end(a), [](Node &e1, Node &e2)
{ return e1.v < e2.v; });
sort(begin(b), end(b), [](Node &e1, Node &e2)
{ return e1.v < e2.v; });
int stb = -1;
for (int i = n - k; i < n; i++)
b[++stb].id = a[i].id;
for (int i = 0; i < n - k; i++)
b[++stb].id = a[i].id;
sort(begin(a), end(a), [](Node &e1, Node &e2)
{ return e1.id < e2.id; });
sort(begin(b), end(b), [](Node &e1, Node &e2)
{ return e1.id < e2.id; });
int cnt = 0;
for (int i = 0; i < n; i++)
cnt += a[i].v > b[i].v;
if (cnt - k)
{
cout << "NO";
el;
return;
}
cout << "YES";
el;
for (auto [v, id] : b)
cout << v << ' ';
el;
}