10.11模拟赛总结
总结
估分 \([40, 70] + [70, 80] + [0, 45] + [20, 30] = [130, 225]\)。
\(40 + 80 + 0 + 20 = 140\),Rk.14,寄寄寄/wq。
\(\texttt{T1 reflect}\)
题意
有一个几何图形有两条对称轴夹角为 \(\dfrac{p}{q}\),求最少还有几条对称轴。
分析
设最小的对称轴数量为 \(k\),那么不难推出式子:
但是由于题目中说了“还”这个字,所以答案为 \(k - 2\)。
警示后人:不开 long long 见祖宗!!!
寄因
挂分:\(\texttt{60pts}\)
原因:没有推出式子/kk
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
long long p, q;
cin >> p >> q;
cout << q * 180ll / __gcd(q * 180ll, p) - 2ll << '\n';
}
return 0;
}
\(\texttt{T2 multi}\)
题意
若 \(a, b\) 都为 \(K\) 位无符号二进制非负整数,定义新运算 \(a +^\hat{}\ b\) 为,若 \(a, b\) 最高位都为 \(1\),那么最高位的进位将进在最后一位上。
举个例子:
若 \(K = 2\),那么:
且
然后定义新运算 \(a \times^\hat{}\ b = \begin{cases}0, b = 0\\a \times^\hat{}\ (b - 1), b \ne 0\end{cases}\)。
给定 \(K\),请你求出 \(\forall 0 \le i < 2^k, 0 \le j < 2^k\),\(i \times^\hat{}\ j\) 的值。
分析
简单模拟题,只是需要亿点点卡常(
对于每个 \(i\),定义 \(sum = 0\),然后每次输出后模拟一下 \(\,+^\hat{}\,\) 的过程就行了。
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int k;
signed main() {
cin >> k;
for (int i = 0; i < 1 << k; i++) {
int sum = 0;
for (int j = 0; j < 1 << k; j++) {
cout << sum << ' ';
sum = sum + i + (bool)(sum + i & (1 << k)) & ((1 << k) - 1);
}
cout << '\n';
}
return 0;
}
(没想到不关同步流都能跑进 \(850\) 毫秒)
\(\texttt{T3 game}\)
题意
有一棵高度为 \(n\) 的满二叉树,节点上有颜色“黑色”(1)、“白色”(0),有如下操作:
-
将每个棋子移动到当前节点的左孩子;
-
将每个棋子移动到当前节点的右孩子;
-
将每个棋子分别复制到当前的左右孩子。
-
如果棋子走出了这棵树,那么拿走这颗棋子。
如果走过的黑色棋子数量为偶数,Alice 获胜,否则 Bob 获胜。
每次在第 \(i\) 个节点处放上一枚棋子,假设两个人都采用最优策略,问谁能赢。
分析
有点像博弈论,先去补了,鸽鸽鸽。
哦,爆搜,搜完之后判断一下,有没有赢得可能,只要有一个可能能赢就赢了,输得可能性只有所有的可能都是输。
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 1 << 16;
struct T {
set<int> s;
bool operator<(const T &a) const {
return s != a.s ? 1 : 0;
}
};
int l[kMaxN], r[kMaxN], a[kMaxN], p[105][105], b[105], vis[105], n, tot, rt;
map<T, bool> mp[2][2];
int Dfs(int op, int cnt, set<int> v) {
T x;
x.s = v;
if (mp[op][cnt].count(x)) {
return mp[op][cnt][x];
} else if (!v.size()) {
return !cnt;
} else {
set<int> t[3];
for (int i : v) {
if (l[i]) {
t[0].insert(l[i]);
}
if (r[i]) {
t[1].insert(r[i]);
}
if (l[i] && r[i]) {
t[2].insert(l[i]);
t[2].insert(r[i]);
}
cnt += a[i];
}
cnt %= 2;
int x = rand() % tot + 1;
if (op == 0) {
if (Dfs(1, cnt, t[p[x][1] - 1])) {
return 1;
} else if (Dfs(1, cnt, t[p[x][2] - 1])) {
return 1;
} else if (Dfs(1, cnt, t[p[x][3] - 1])) {
return 1;
}
return 0;
} else {
if (!Dfs(0, cnt, t[p[x][1] - 1])) {
return 0;
} else if (!Dfs(0, cnt, t[p[x][2] - 1])) {
return 0;
} else if (!Dfs(0, cnt, t[p[x][3] - 1])) {
return 0;
}
return 1;
}
}
}
void Sol(int stp) {
if (stp > 3) {
++tot;
for (int i = 1; i <= 3; i++) {
p[tot][i] = b[i];
}
return;
}
for (int i = 1; i <= 3; i++) {
if (!vis[i]) {
vis[i] = 1;
b[stp] = i;
Sol(stp + 1);
vis[i] = 0;
}
}
}
int main() {
srand(time(0));
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> l[i] >> r[i] >> a[i];
}
Sol(1);
for (rt = 1; rt <= n; rt++) {
set<int> v;
v.insert(rt);
cout << (Dfs(0, 0, v) ? "Alice" : "Bob") << '\n';
}
return 0;
}
}
\(\texttt{T4 sign}\)
题意
对于 \(n\) 的排列 \(a\) 和 \(b\),定义 \(a \circ b\) 为,对于 \(\forall 1 \le i \le n, a_i = a_{b_i}\);定义 \(a^m\) 为 \(\begin{cases}a, m = 1\\a \circ a_{m - 1}, m > 1\end{cases}\)。
给定一个 \(n\) 的排列 \(a\) 和正整数 \(m\),求 \(a^m\)。
分析
好典。
找一下环,然后高精模一下,没了。
代码
点击查看代码
这个就不一定是浅浅了(
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int kMaxN = 1e6 + 5;
int n, tow[kMaxN], ms;
string m;
int ans[kMaxN];
int vis[kMaxN], siz[kMaxN], isz[kMaxN];
vector<int> sizs, mods;
void dfs(int u, int rt) {
vis[u] = rt;
siz[rt]++;
if (tow[u] == rt) {
if (!isz[siz[rt]]) {
sizs.push_back(siz[rt]);
isz[siz[rt]] = sizs.size() - 1;
}
return;
}
dfs(tow[u], rt);
}
int mod(int p) {
ll res = 0ll;
for (int i = 1; i <= ms; i++) {
int cc = m[i] - '0';
res = res * 10 + cc;
if (res >= p) {
res %= p;
}
}
return res;
}
void solve(int u, int v) {
ans[u] = v;
if (!ans[tow[u]]) {
solve(tow[u], tow[v]);
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
tow[i] = x;
}
cin >> m;
ms = m.size();
m = " " + m;
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
dfs(i, i);
}
}
for (int i = 0; i < sizs.size(); i++) {
mods.push_back(mod(sizs[i]));
}
for (int i = 1; i <= n; i++) {
if (vis[i] == i) {
int y = i, jps = mods[isz[siz[i]]];
for (int j = 1; j <= jps; j++) {
y = tow[y];
}
solve(i, y);
}
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << ' ';
}
return 0;
}

浙公网安备 33010602011771号