多校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

只写了部分分暴力还是不放了。

posted @ 2025-10-23 22:04  HS_fu3  阅读(7)  评论(0)    收藏  举报