F - Forest Program 加反思

这次组队赛又被锤了,和队友开题过了签到,然后就没有了,这题其实我看懂了点,就有了思路,但是无奈我不会求环的周长,印象中 t a r j a n tarjan tarjan求无向图的连通分量可以,也没问队友就去照着模板抄了抄,写了两个小时写崩了,因为题意也没看太懂,给队友随便口胡了一个题意,队友就开始敲那个假题意的算法了,敲完后,题目怎么也过不去,最后发现看题,看错题,敲那个代码完全没用,赛后,问另一个队友,他说他会dfs求几个环的点,带环的周长。我为什么没有和好好交流这题呢。按理说,这题如果好好交流,并且好好看题,一个小时以内就能出,剩下4个小时,三个人好好开一题,应该还能开出来。

反思:
重要的话说四遍:
1:看题!看题!看题!看题! 哪怕三人用半个小时看题,再也不没搞清思路,就开始胡敲
2:一定要和队友交流,如果无法实现代码,一定要和队友好好交流,直到思路清晰,可以实现,感觉问题不大,再开始敲代码
3:不要乱开题,跟榜,跟榜,即使感觉可以写,但榜单上过的人很少,就果断放弃,去写大部分人没写的!
4:稳定心态,稳定心态,太急了,分题去写我们队暂时不具备这样的能力,最多分出一个人去写,剩下两个人一定要一起写。

参考代码:

/*
 * @Author: vain
 * @Date: 2020
 * @LastEditTime: 2020-10-04 21:04:16
 * @LastEditors: sueRimn
 * @Description: 学不会 dp 的 fw
 * @FilePath: \main\demo.cpp
 */
//#include <bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include <bitset>
using namespace std;
typedef long long ll;
#define ll long long
//typedef unsigned long long uint;
const int N = 5000 + 20;
const int maxn = 5e5 + 20;
const int mod = 998244353;
ll in[maxn], cnt, head[maxn];
typedef pair<ll, ll> p;
//priority_queue<p, vector<p>, greater<p>> q;
//int sum[maxn];
double Max(double a, double b) {
    
     return a > b ? a : b; }
int min(int a, int b) {
    
     return a < b ? a : b; }
int gcd(int a, int b) {
    
     return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) {
    
     return a * b / gcd(a, b); }
void swap(int &x, int &y) {
    
     x ^= y, y ^= x, x ^= y; }
int lowbit(int x) {
    
     return (x) & (-x); }
map<int, int> mp;
ll ksm(ll a, ll b)
{
    
    
    ll res = 1;
    for (; b;)
    {
    
    
        if (b & 1)
            res = (res * a) % mod;
        b >>= 1, a = a * a % mod;
    }
    return res;
}
int read(int &v)
{
    
    
    int k = 1;
    v = 0;
    int c = getchar();
    while (c < '0' || c > '9')
    {
    
    
        if (c == '-')
            k = 0;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
        v = (v << 3) + (v << 1) + (c - 48), c = getchar();
    if (k == 0)
        v = -v;
    return c;
}
vector<int> f[maxn];
int k, tim, top, rt;
struct node
{
    
    
    int v, nex;
} edge[maxn];
int low[maxn], dfn[maxn], stac[maxn];
void add(int u, int v)
{
    
    
    edge[cnt].v = v, edge[cnt].nex = head[u];
    head[u] = cnt++;
}
int vis[maxn], depth[maxn], v[maxn], len;
void dfs(ll x, ll fa)
{
    
    
    for (ll i = head[x]; ~i; i=edge[i].nex)
    {
    
    
        ll y = edge[i].v;
        if (fa == y)
            continue;
        if (vis[y] && depth[x] - depth[y] > 1)
        {
    
    
            v[len++] = depth[x] - depth[y] + 1;
        }
        else if (vis[y] == 0)
        {
    
    
            vis[y] = 1;
            depth[y] = depth[x] + 1;
            dfs(y, x);
        }
    }
}
int main()
{
    
    
    int n, m;
    read(n), read(m);
    for (int i = 1; i <= n; i++)
        head[i] = -1;
    for (int i = 1; i <= m; i++)
    {
    
    
        int u, v;
        read(u), read(v);
        add(u, v), add(v, u);
    }
    for (int i = 1; i <= n; i++)
    {
    
    
        if (!vis[i])
        {
    
    
            vis[i] = depth[i] = 1;
            dfs(i, 0);
        }
    }
    int res = 0;
    ll ans = 1;
    for (int i = 0; i < len; i++)
    {
    
    
        ans = (ans * (ksm(2, v[i]) - 1 + mod) % mod) % mod;
        res += v[i];
    }
    ans = (ans * ksm(2, m - res)) % mod;
    printf("%lld\n", ans);
}

猜你喜欢

转载自blog.csdn.net/yangzijiangac/article/details/108922694