AI大战原神
deepseek 做 genshin oi round 1。
获得了
第一题简单构造不在话下。
第二题 AI 居然识破了概率不是 1 就是 0,但是在实现时遗憾只获得了 60 分。
第三题 AI 似乎没有发现答案是叶子个数,而是通过正常的期望算法做题,不知道怎么RE了。只在
第四题 AI 居然会
附四道题 AI 代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> c(n);
long long sum = 0;
for (int i = 0; i < n; ++i) {
cin >> c[i];
sum += c[i];
}
if (sum % n != 0) {
cout << -1 << endl;
return 0;
}
if (n % 2 == 0) {
cout << -1 << endl;
return 0;
}
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) {
a[i] = (n - c[i]) % n;
b[i] = (2 * c[i]) % n;
}
for (int i = 0; i < n; ++i) {
cout << a[i] << (i == n-1 ? "\n" : " ");
}
for (int i = 0; i < n; ++i) {
cout << b[i] << (i == n-1 ? "\n" : " ");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
vector<int> bfs(int n, const vector<vector<int>>& adj, int start) {
vector<int> d(n + 1, -1);
queue<int> q;
q.push(start);
d[start] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (d[v] == -1) {
d[v] = d[u] + 1;
q.push(v);
}
}
}
return d;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
vector<vector<int>> adj(n + 1);
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> d = bfs(n, adj, 1);
vector<vector<int>> parents(n + 1);
for (int u = 1; u <= n; ++u) {
if (d[u] == -1) continue;
for (int v : adj[u]) {
if (d[v] == d[u] - 1) {
parents[u].push_back(v);
}
}
}
bool valid = true;
for (int u = 1; u <= n && valid; ++u) {
if (d[u] <= 0) continue; // skip node 1 and unreachable nodes
for (int p : parents[u]) {
for (int v : adj[p]) {
if (d[p] == -1) continue;
if (d[v] == d[p] - 1) continue; // v is parent of p
if (d[v] >= d[p] + 1) continue;
valid = false;
break;
}
if (!valid) break;
}
}
if (valid) {
cout << "1.000\n";
} else {
cout << "0.000\n";
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 998244353;
const int N = 2e5 + 10;
int inv[N];
struct Tree {
vector<int> parent;
vector<unordered_set<int>> children;
int root;
ll sum;
int n;
Tree(int size) : parent(size + 1), children(size + 1), root(1), sum(0), n(size) {
for (int i = 1; i <= size; ++i) {
children[i] = unordered_set<int>();
}
parent[1] = 0;
for (int i = 2; i <= size; ++i) {
int f;
cin >> f;
parent[i] = f;
children[f].insert(i);
}
for (int u = 1; u <= size; ++u) {
if (children[u].size() > 0) {
sum = (sum + (children[u].size() - 1)) % MOD;
}
}
}
void add(int u, int v) {
children[u].insert(v);
parent[v] = u;
int c = children[u].size();
if (c == 1) {
sum = (sum + 0) % MOD;
} else {
sum = (sum + 1) % MOD;
}
}
void del(int u) {
int p = parent[u];
children[p].erase(u);
int c = children[p].size();
if (c == 0) {
sum = (sum - (children[p].size() + 1 - 1)) % MOD;
} else {
sum = (sum - 1) % MOD;
}
}
void upd(int new_root) {
root = new_root;
}
ll get_ans() {
return (1 + sum + MOD) % MOD;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
Tree tree(n);
cout << tree.get_ans() << '\n';
int m;
cin >> m;
int added = 0;
for (int i = 0; i < m; ++i) {
string op;
int u;
cin >> op >> u;
if (op == "Add") {
added++;
int v = n + added;
tree.add(u, v);
} else if (op == "Del") {
tree.del(u);
} else if (op == "Upd") {
tree.upd(u);
}
cout << tree.get_ans() << '\n';
}
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
const long double PI = 3.141592653589793238462643383279502884L;
long long compute(long long n) {
long double ratio = 6.0L / (PI * PI);
long double res = n * (1.0L - ratio);
return static_cast<long long>(res + 0.5L); // 四舍五入到最近的整数
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
long long n;
cin >> n;
cout << compute(n) << '\n';
}
return 0;
}