这次组队赛又被锤了,和队友开题过了签到,然后就没有了,这题其实我看懂了点,就有了思路,但是无奈我不会求环的周长,印象中 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); }