-
Bio
不知不觉成为初三老登了...
但我的水平还停留在初二啊喂 QAQ
QQ 2234970744
能写题解的题目:
AT_abc282_h 笛卡尔树 + 启发式合并做法
CF1361 字典树 + 欧拉回路做法
AT_abc379_g
#include <bits/stdc++.h> #define Code using #define by namespace #define zzx std Code by zzx; const int N = 200, mod = 998244353; int h, w, a[N + 10][N + 10]; vector<int> s[N + 10], dp[N + 10]; void dfs(int j, int la, int state, int i) { if(j == w + 1) { s[i].push_back(state); dp[i].push_back(-1); } if(a[i][j] >= 0) { if(a[i][j] == la) return; dfs(j + 1, a[i][j], state * 3 + a[i][j], i); return; } for(int x = 0; x < 3; ++x) { if(x == la) continue; dfs(j + 1, x, state * 3 + x, i); } } bool check(int u, int v) { for(int i = 1; i <= w; ++i) { if(u % 3 == v % 3) return false; u /= 3; v /= 3; } return true; } int dfs2(int u, int id) { if(u == 1) return 1; if(dp[u][id] != -1) return dp[u][id]; int res = 0; for(int i = 0; i < (int)s[u - 1].size(); ++i) { if(check(s[u][id], s[u - 1][i])) res = (res + dfs2(u - 1, i)); } dp[u][id] = res; return res; } int main() { cin >> h >> w; for(int i = 1; i <= h; ++i) { string tmp; cin >> tmp; for(int j = 1; j <= w; ++j) { int x; if(tmp[j - 1] == '1') x = 0; else if(tmp[j - 1] == '2') x = 1; else if(tmp[j - 1] == '3') x = 2; else x = -1; if(h >= w) a[i][j] = x; else a[j][i] = x; } } if(h < w) swap(h, w); for(int i = 1; i <= h; ++i) dfs(1, -1, 0, i); int ans = 0; for(int i = 0; i < (int)s[h].size(); ++i) ans = (ans + dfs2(h, i)); cout << ans; return 0; }
P2152 hack
#include <iostream> #include <vector> #include <string> #include <algorithm> #include <cctype> // 高精度数字结构体 struct HighPrecision { private: std::vector<int> digits; // 存储数字的每一位,低位在前 bool isNegative; // 标记是否为负数 // 移除前导零(优化:一次resize代替多次pop_back) void trimLeadingZeros() { if (digits.size() <= 1) return; // 从高位向低位查找第一个非零数字 auto it = digits.rbegin(); while (it != digits.rend() && *it == 0) { ++it; } // 处理全零情况 if (it == digits.rend()) { digits.resize(1); digits[0] = 0; } else { // 直接调整大小,避免多次pop_back digits.resize(it.base() - digits.begin()); } } // 两个正数的数字相加(优化:分阶段处理,减少条件判断) std::vector<int> addDigits(const std::vector<int>& a, const std::vector<int>& b) const { std::vector<int> result; // 提前预留最大可能空间,避免多次扩容 result.reserve(std::max(a.size(), b.size()) + 1); int carry = 0; size_t minLen = std::min(a.size(), b.size()); // 第一阶段:处理两个数共有的位数 for (size_t i = 0; i < minLen; ++i) { int sum = a[i] + b[i] + carry; result.push_back(sum % 10); carry = sum / 10; } // 第二阶段:处理a的剩余位数 for (size_t i = minLen; i < a.size(); ++i) { int sum = a[i] + carry; result.push_back(sum % 10); carry = sum / 10; } // 第三阶段:处理b的剩余位数 for (size_t i = minLen; i < b.size(); ++i) { int sum = b[i] + carry; result.push_back(sum % 10); carry = sum / 10; } // 处理最后的进位 if (carry > 0) { result.push_back(carry); } return result; } public: // 构造函数 HighPrecision() : isNegative(false), digits({0}) {} HighPrecision(const std::string& str) { fromString(str); } // 移动构造函数(减少复制开销) HighPrecision(HighPrecision&& other) noexcept : digits(std::move(other.digits)), isNegative(other.isNegative) {} // 移动赋值运算符(减少复制开销) HighPrecision& operator=(HighPrecision&& other) noexcept { if (this != &other) { digits = std::move(other.digits); isNegative = other.isNegative; } return *this; } // 字符串转为高精度数字(优化:提前预留空间) void fromString(const std::string& str) { digits.clear(); isNegative = false; size_t start = 0; // 处理负号 if (!str.empty() && str[0] == '-') { isNegative = true; start = 1; } // 提前预留空间,避免多次内存分配 digits.reserve(str.size() - start); // 从字符串读取数字,逆序存储(低位在前) for (int i = str.size() - 1; i >= static_cast<int>(start); --i) { if (isdigit(str[i])) { digits.push_back(str[i] - '0'); } else { // 如果包含非数字字符,视为0 digits.clear(); isNegative = false; digits.push_back(0); return; } } // 处理空字符串或全是符号的情况 if (digits.empty()) { digits.push_back(0); } trimLeadingZeros(); } // 加法运算 HighPrecision add(const HighPrecision& other) const { HighPrecision result; if (!isNegative && !other.isNegative) { // 两个正数相加 result.isNegative = false; result.digits = addDigits(digits, other.digits); } else if (isNegative && other.isNegative) { // 两个负数相加 result.isNegative = true; result.digits = addDigits(digits, other.digits); } else { // 暂不实现正负混合加法,仅处理同号加法 result.digits = {0}; result.isNegative = false; } result.trimLeadingZeros(); return result; } // 获取数字位数 size_t getDigitCount() const { return digits.size(); } // 输出数字(优化:使用下标访问代替reverse_iterator) void print() const { if (isNegative && !(digits.size() == 1 && digits[0] == 0)) { std::cout << "-"; } // 从高位到低位输出 for (int i = digits.size() - 1; i >= 0; --i) { std::cout << digits[i]; } } // 转换为字符串(优化:提前预留空间,使用下标访问) std::string toString() const { std::string str; // 提前预留空间 str.reserve(digits.size() + (isNegative ? 1 : 0)); if (isNegative && !(digits.size() == 1 && digits[0] == 0)) { str += "-"; } // 从高位到低位添加 for (int i = digits.size() - 1; i >= 0; --i) { str += char('0' + digits[i]); } return str; } } a, b, c; // 重载加法运算符 HighPrecision operator+(const HighPrecision& a, const HighPrecision& b) { return a.add(b); } // 重载输出运算符 std::ostream& operator<<(std::ostream& os, const HighPrecision& hp) { os << hp.toString(); return os; } int main() { a.fromString("1"); b.fromString("1"); while(true) { c = a + b; if(c.getDigitCount() >= 100000) { freopen("hack.in", "w", stdout); a.print(); putchar('\n'); b.print(); return 0; } // 使用移动语义,避免不必要的深拷贝 a = std::move(b); b = std::move(c); if(b.getDigitCount() % 100 == 0) std::cout << b.getDigitCount() << '\n'; } return 0; }
-
Recent Activities