多校7
10.22
其实 10.23 补的,原因见 CSP-S 36
神秘加赛?
还是神秘二进制专场。
t1
神秘打表结论题。
以后再也不直接硬找规律了www
结果就是找了2h,不断往规律上打补丁,成屎山了。
容易想到枚举 gcd 和其倍数。
然后发现 异或 \(>\) 两数相减 \(>\) gcd ,于是当且仅当gcd 等于两数相减才可能成立。
code
呜呜呜
#include <bits/stdc++.h>
using namespace std;
int n;
signed main()
{
freopen("gcdxor.in", "r", stdin);
freopen("gcdxor.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
int ans = 0;
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n - i; j += i)
ans += ((j ^ (j + i)) == i);
cout << ans << "\n";
return 0;
}
t2
水题。
真比 t1 简单吧。
赛时有乃龙因为没有大阳历爆了,还有wxy 2^13 的数组大小🤪。
accoder 机子死慢,我用unordered_map 怎么你了???
简单题,直接看。
code
嘻嘻哈哈
#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int cnt[(1<<13)+10], las[(1<<13)+10], f[(1<<13)+10];
int k, q;
signed main()
{
freopen("xortree.in", "r", stdin);
freopen("xortree.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> k >> q;
las[k] = 1;
int opt, x;
while (q--)
{
cin >> opt >> x;
if (opt == 1)
{
for (int i = 0; i < (1<<13); ++i)
{
cnt[i ^ x] += las[i];
if (cnt[i ^ x] >= mod)
cnt[i ^ x] -= mod;
}
memcpy(f, las, sizeof(f));
for (int i = 0; i < (1<<13); ++i)
{
las[i ^ x] += f[i];
if (las[i ^ x] >= mod)
las[i ^ x] -= mod;
}
}
else
cout << (cnt[x] + las[x]) % mod << "\n";
}
return 0;
}
t3
加了最优性剪枝的暴力即为正解。
赛时读假题,然后在此基础上想假做法,然后在此基础上写假了。
结果就是改完一个假发现还有一个。
弘文了😡
其实说暴力不准确(毕竟有拓扑),但计算答案是暴力算的。
code
阿巴阿巴
#include <bits/stdc++.h>
#define pir pair<int, int>
#define int long long
#define fi first
#define se second
using namespace std;
const int N = 1e6 + 10;
int n, m;
int in[N], val[N], ans[N];
vector<int> e[N];
vector<pir> f[N];
queue<int> q;
inline bool cmp(pir a, pir b) { return a.fi > b.fi; }
inline void merge(int x, int y)
{
for (auto i : f[y])
{
int sum = -1;
for (auto j : f[x])
{
if (i.se == j.se)
goto con;
sum = max(sum, i.fi & j.fi);
}
ans[x] = max(ans[x], sum);
f[x].emplace_back(i);
con:;
}
sort(f[x].begin(), f[x].end(), cmp);
while (f[x].back().fi < ans[x])
f[x].pop_back();
}
inline void topu()
{
for (int i = 1; i <= n; ++i)
if (!in[i])
q.push(i);
while (q.size())
{
int x = q.front();
q.pop();
for (auto y : e[x])
{
merge(y, x);
--in[y];
if (!in[y])
q.push(y);
}
}
}
signed main()
{
freopen("stone.in", "r", stdin);
freopen("stone.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
cin >> val[i];
f[i].emplace_back((pir){val[i], i});
ans[i] = -1;
}
for (int i = 1, u, v; i <= m; ++i)
{
cin >> u >> v;
e[v].emplace_back(u);
++in[u];
}
topu();
for (int i = 1; i <= n; ++i)
cout << ans[i] << ' ';
return 0;
}
t4
只写了部分分暴力还是不放了。
本文来自博客园,作者:HS_fu3,转载请注明原文链接:https://www.cnblogs.com/HS-fu3/p/19161754

浙公网安备 33010602011771号