1.了解了各种输入挂性orz,找到了一个合适的
2.find用while写能快一倍,并且能被数据卡掉
3.取模只能快十几毫秒,但也能被数据卡掉
取模find双优化是1997mm过的
再加一个性价比较高的输入挂是438mm 23333
#include <cstdio> #include <cmath> #include <complex> #include <algorithm> #include <iostream> #include<string.h> #include<vector> #include<ctime> #define rep(i,t,n) for(int i =(t);i<=(n);++i) #define per(i,n,t) for(int i =(n);i>=(t);--i) #define mmm(a,b) memset(a,b,sizeof(a)) typedef long long ll; using namespace std; #define N 2333333 const ll M= 998244353; const int maxn = 4e6 + 5; int f[maxn]; using namespace std; template<typename T>inline void add_(T &A, int B, ll MOD = M) { A += B; (A >= MOD) && (A -= MOD); } template<typename T>inline void mul_(T &A, ll B, ll MOD = M) { A = (A*B) % MOD; } namespace IO { const int MAXL = 1 << 15; char buf[MAXL], *S, *T, ch; inline char Getch() { if (S == T) T = (S = buf) + fread(buf, 1, MAXL, stdin); return S == T ? EOF : *S++; } inline void Read(int &x) { x = 0; while (!isdigit(ch = Getch())); do { x = x * 10 + (ch ^ ‘0‘); } while (isdigit(ch = Getch())); } } using namespace IO; int find(int x) { while (f[x] ^ x)x = f[x] = f[f[x]]; return x; } void un(int x, int y) { int xx = find(x), yy = find(y); if(xx^yy)f[xx] = yy; } int main() { int n, m; cin >> n >> m; rep(i, 1, n)f[i] = i; int op, a, b; ll ans = 0; rep(i, 1, m) { Read(op); Read(a); Read(b); if(!op)un(a, b); else { add_(ans, ans + (find(a) == find(b))); } } cout << ans << endl; cin >> n; }
原文地址:https://www.cnblogs.com/SuuT/p/9648299.html
时间: 2024-10-04 18:31:56