343
A - Wrong Answer
给你两个整数
请打印出不等于
void solve() {
int a, b;cin >> a >> b;
for (int i = 0;i <= 9;i++) {
if (i != a + b) {
cout << i << '\n';return;
}
}
}
B - Adjacency Matrix
有一个简单的无向图
给你
对于每个
这里,当且仅当顶点
int a[110][110];
void solve() {
int n;cin >> n;
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
cin >> a[i][j];
if (a[i][j]) {
cout << j + 1 << ' ';
}
}
cout << '\n';
}
}
C - 343
给你一个正整数
求一个不大于
这里,正整数
- 有一个正整数
,使得 . 的十进制表示不含前导零,是一个宫调立方数。更确切地说,如果用介于 和 (含)之间的整数 和介于 和 (含)之间的整数 将 表示为 ,则所有 都是 。
#define int long long
void solve() {
vector<int> cu;
for (int i = 0;i <= 1e6;i++) {
bool ok = true;
string s = to_string(i * i * i);
for (int j = 0;j < s.size();j++) {
if (s[j] != s[s.size() - 1 - j])ok = false;
}
if (ok)
cu.push_back(i * i * i);
}
int n;cin >> n;
int pos = upper_bound(cu.begin(), cu.end(), n) - cu.begin();
cout << cu[pos - 1] << '\n';
}
D - Diversity of Scores
高桥正在举办一场有
高桥的预知能力让他知道选手们的分数将如何变化。具体来说,对于
高桥希望分数多样化,他想知道在每个时刻棋手的分数中会出现多少个不同的分数值。对于每个
例如,如果在某一时刻球员的得分分别为
Solution
map
的使用
在这个问题中,只需将玩家的当前分数用作索引,并为每个索引
- 准备一个关联数组
。 - 添加索引
到 ,令 。 - 准备一个数组
,存储玩家的分数,将每个元素初始化为 。 - 对于每个
,执行以下操作: - 减少
的值。 - 如果
变为 ,则从 中删除索引 。 - 将
添加到 。 - 如果
不包含索引 ,则插入它,并令 。 - 增加
的值。 - 打印
的当前大小(元素数量)。
- 减少
#define int long long
void solve() {
int n, t;cin >> n >> t;
vector<int> a(n + 1);
map<int, int> m;
m[0] = n;
while (t--) {
int x, y;cin >> x >> y;
if (--m[a[x]] == 0)m.erase(a[x]);
a[x] += y;
m[a[x]]++;
cout << m.size() << '\n';
}
}
E - 7 x 7 x 7
在一个坐标空间中,我们想放置三个边长为
的立方体,这样正好一个、两个、三个立方体所包含区域的体积分别为 、 、 。
对于三个整数
请判断是否有满足下列所有条件的九个整数
- 设
. - 恰好包含
中一个的区域的体积为 。 - 恰好包含两个
的区域的体积是 。 - 所有
所包含的区域的体积是 。
- 恰好包含
Solution
容斥原理
官方题解:
只有各个区域之间的相对位置才是重要的,因此可以固定其中一个区域。在此后,我们将
的位置固定为 。 现在我们有以下事实:
事实:可以加入额外的约束条件,使得
和 有交集,即它们分享一个正体积、边或顶点的区域,而不影响解的存在。换句话说,如果原问题有解,那么在加入这个条件后仍然有解。 这是因为,如果
和 没有交集,那么可以平移 而不改变 和 的值,使其与 接触。当 和 有交集, 和 也有交集,但 和 没有时,可能会认为 无法移动;但在这种情况下,可以交换 和 ,然后平移所有的立方体,使得 。 根据这个事实,我们可以假设
的绝对值不大于 ,这样可以将候选数量减少到 。剩下的就是对于给定的 ,找到恰好包含在一个、两个或三个立方体中的区域的体积。 首先,可以通过以下方式找到立方体
和 的交集的体积 ,即 ,因为交集可以表示为:
。 同样适用于三个立方体
、 和 的交集的体积 。 接下来,用包含-排斥原理的思想,定义
为恰好包含 个立方体的区域,可以如下找到 和 :
因此,可以对所有的
的候选值找到 ,并检查它们是否与 一致来解决问题。 附加内容
事实上,可以实验性地将
的范围限定为 。但尚未证明这一点,也不清楚与立方体边长的独立性。
对于一条线段,坐标分别为
同理,对于一个三维的物体,则需要对于每个维度查看相交的部分,再依次相乘即可。
#include<bits/stdc++.h>
using namespace std;
int f(int a1, int b1, int c1, int a2, int b2, int c2) {
int res = 1;
res *= max(0, min(a1, a2) + 7 - max(a1, a2));
res *= max(0, min(b1, b2) + 7 - max(b1, b2));
res *= max(0, min(c1, c2) + 7 - max(c1, c2));
return res;
}
int f(int a1, int b1, int c1, int a2, int b2, int c2, int a3, int b3, int c3) {
int res = 1;
res *= max(0, min({a1, a2, a3}) + 7 - max({a1, a2, a3}));
res *= max(0, min({b1, b2, b3}) + 7 - max({b1, b2, b3}));
res *= max(0, min({c1, c2, c3}) + 7 - max({c1, c2, c3}));
return res;
}
int main() {
int v1, v2, v3;
cin >> v1 >> v2 >> v3;
for (int a2 = -7; a2 <= 7; a2++) {
for (int b2 = -7; b2 <= 7; b2++) {
for (int c2 = -7; c2 <= 7; c2++) {
for (int a3 = -7; a3 <= 7; a3++) {
for (int b3 = -7; b3 <= 7; b3++) {
for (int c3 = -7; c3 <= 7; c3++) {
int nv3 = f(0, 0, 0, a2, b2, c2, a3, b3, c3);
int nv2 = f(0, 0, 0, a2, b2, c2) + f(0, 0, 0, a3, b3, c3) + f(a2, b2, c2, a3, b3, c3) - nv3 * 3;
int nv1 = 3 * 7 * 7 * 7 - nv2 * 2 - nv3 * 3;
if (v1 != nv1 or v2 != nv2 or v3 != nv3) continue;
printf("Yes\n0 0 0 %d %d %d %d %d %d\n", a2, b2, c2, a3, b3, c3);
return 0;
}
}
}
}
}
}
cout << "No" << endl;
}
F - Second Largest Query
给你一个长度为
请按照给出的顺序处理
- 类型
:以 1 p x
的形式给出。将的值改为 。 - 类型
:以 2 l r
的形式给出,打印中第二大数值的出现次数。更准确地说,打印满足 的整数 的个数,即在 中正好有一个大于 的不同值。
Solution
线段树(待更