Day-0

T1

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

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

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

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 2024-02-14 21:24  Bubble_e  阅读(34)  评论(0)    收藏  举报