Day-0

T1

  • 从一点开始以固定方向行走,会出现循环节

    • 该结论由 n=m 的测试点推出
  • 判断两个串是否相同

    • 字符串哈希
  • 倍增预处理出长度为 2len​ 的循环节子串

T2

  • 最小环计数

  • Floyd 会超时

  • 计数由 x,y,st 构成的环

    • 依题解代码
  • 同学赛时代码

    • 更好理解
    #include <bits/stdc++.h>
    #define N 6005 //记得改数据范围!!!!!!!!!!!!!!!!!! !!!!!!!!!!
    #define M 10000005
    #define ll long long
    #define lowbit(x) (x & -x)
    #define ls(x) llll[x]
    #define rs(x) rrrr[x]
    #define x first
    #define y second
    #define PII pair<int, int>
    #define PIL pair<int, ll>
    #define PLI pair<ll, int>
    #define PLL pair<ll, ll>
    #define mk make_pair
    #define mod 998244353 //改模数!!!!!!!!!!!!
    #define bas 29
    //#define int long long
    using namespace std;
    int n, m;
    struct node {
    int v, id;
    };
    vector<node> mp[N];
    struct eee {
    int u, v;
    } edge[N];
    int dis[N], vis[N];
    ll cnt[N];
    signed main() {
    freopen("b.in", "r", stdin);
    freopen("b.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
    int u, v;
    cin >> u >> v;
    edge[i] = (eee){ u, v };
    mp[u].push_back((node){ v, i });
    mp[v].push_back((node){ u, i });
    }
    int minn = 1e9;
    ll ans = 0;
    for (int i = 1; i <= m; ++i) {
    int s = edge[i].u, t = edge[i].v;
    queue<PII> l;
    l.push(mk(s, 0));
    memset(vis, 0, sizeof(vis));
    memset(dis, 0x3f, sizeof(dis));
    memset(cnt, 0, sizeof(cnt));
    cnt[s] = 1;
    dis[s] = 0;
    while (!l.empty()) {
    int u = l.front().x;
    l.pop();
    if (vis[u])
    continue;
    vis[u] = 1;
    for (int j = 0; j < mp[u].size(); ++j) {
    int v = mp[u][j].v;
    if (mp[u][j].id > i) {
    l.push(mk(v, dis[u] + 1));
    if (dis[u] + 1 < dis[v]) {
    dis[v] = dis[u] + 1;
    cnt[v] = cnt[u];
    } else if (dis[u] + 1 == dis[v])
    cnt[v] += cnt[u];
    }
    }
    }
    if (dis[t] + 1 < minn) {
    minn = dis[t] + 1;
    ans = cnt[t];
    } else if (dis[t] + 1 == minn)
    ans += cnt[t];
    }
    cout << ans;
    return 0;
    }

T3

  • 区间DP

    • 适用范围:子问题解决 能使得 母问题解决
  • std::max

    • 传入多个参数

    • 好像更快

      # include <bits/stdc++.h>
      # define int long long
      using namespace std;
      signed main(){
      int a = 6, b = 66, c = 666;
      int maxi = max({a, b, c});
      cout << maxi << "\n";
      }
    //6.838S
    # include <bits/stdc++.h>
    # define int long long
    using namespace std;
    const int N = (int)5e7 + 10;
    int n = (int)5e7;
    int a[N];
    signed main(){
    freopen("1.in", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    for(int i = 1; i <= n; i++){
    cin >> a[i];
    }
    int maxi = 0;
    for(int i = 1; i <= n; i += 6){
    maxi = max(a[i], max(a[i + 1], max(a[i + 2], max(a[i + 3], max(a[i + 4], a[i + 5])))));
    }
    cout << maxi << "\n";
    }
    //6.711S
    # include <bits/stdc++.h>
    # define int long long
    using namespace std;
    const int N = (int)5e7 + 10;
    int n = (int)5e7;
    int a[N];
    signed main(){
    freopen("1.in", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    for(int i = 1; i <= n; i++){
    cin >> a[i];
    }
    int maxi = 0;
    for(int i = 1; i <= n; i += 6){
    maxi = max({a[i], a[i + 1], a[i + 2], a[i + 3], a[i + 4], a[i + 5]});
    }
    cout << maxi << "\n";
    }

T4

  • 重点在于将原题建图
    • 转化为同一连通块内的问题
    • 将城市看作点,奇数个入度的点需要带仆人
    • 同一连通块内点的入度可以均摊
posted on   Bubble_e  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话



点击右上角即可分享
微信分享提示