classSolution { public: intcountSymmetricIntegers(int low, int high){ int ans = 0; for (int i = low; i <= high; i++) { string s = to_string(i); int n = s.size(); if (n % 2 == 0) { int sum1 = 0, sum2 = 0; for (int i = 0; i < n / 2; i++) { sum1 += s[i] - '0'; } for (int i = n / 2; i < n; i++) { sum2 += s[i] - '0'; } if (sum1 == sum2) { ans++; } } } return ans; } };
8040. 生成特殊数字的最少操作
给你一个下标从 0 开始的字符串 num ,表示一个非负整数。
在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0。
classSolution { public: using pii = pair<int, int>;
voidbfs(vector<int> &depth, vector<vector<pii>> &graph){ depth[0] = 0; queue<int> qu; qu.emplace(0); while (!qu.empty()) { int curr = qu.front(); qu.pop(); for (auto [x, w] : graph[curr]) { if (depth[x] >= 0) continue; depth[x] = depth[curr] + 1; qu.emplace(x); } } }
voidadd(vector<int> &arr1, vector<int> &arr2){ for (int i = 0; i < arr1.size(); i++) { arr1[i] += arr2[i]; } }
vector<int> minOperationsQueries(int n, vector<vector<int>>& edges, vector<vector<int>>& queries){ int m = edges.size(); vector<vector<pii>> graph(n); /* 建立图的关系 */ for (auto e : edges) { int u = e[0], v = e[1], w = e[2]; graph[u].emplace_back(v, w); graph[v].emplace_back(u, w); }
vector<int> res; vector<int> depth(n, -1); int dp[n][21][27]; int fa[n][21]; memset(dp, 0, sizeof(dp)); memset(fa, 0, sizeof(fa));
/* 求每个节点的深度, bfs 或者 dfs 均可*/ bfs(depth, graph);
/* 倍增初始化 */ for (auto e : edges) { int u = e[0], v = e[1], w = e[2]; /* 深度较小的父节点 */ if (depth[u] < depth[v]) { swap(u, v); } fa[u][0] = v; dp[u][0][w]++; }
/* 建立倍增关系 */ for (int j = 1; j <= 20; j++) { for (int i = 0; i < n; i++) { int x = fa[i][j - 1]; int y = fa[x][j - 1]; fa[i][j] = y; /* 每次记录两个节点之间的节点数目关系 */ for (int k = 0; k <= 26; k++) { dp[i][j][k] = dp[i][j - 1][k] + dp[x][j - 1][k]; } } } /* 对每个查询进行 lca 倍增查询 */ for (auto vec : queries) { int x = vec[0]; int y = vec[1]; if (depth[x] > depth[y]) { swap(x, y); }
/* 倍增对齐操作 */ int diff = depth[y] - depth[x]; vector<int> cnt(27); for (int j = 0; diff; ++j, diff >>= 1) { if (diff & 1) { for (int k = 0; k <= 26; k++) { cnt[k] += dp[y][j][k]; } y = fa[y][j]; } } if (x != y) { /* 倍增查询 */ for (int j = 20; j >= 0 && y != x; --j) { if (fa[x][j] != fa[y][j]) { for(int k = 0; k <= 26; k++) { cnt[k] += dp[x][j][k] + dp[y][j][k]; } x = fa[x][j]; y = fa[y][j]; } } for (int k = 0; k <= 26 && x >= 0 && y >= 0; k++) { cnt[k] += dp[x][0][k] + dp[y][0][k]; } } int total = accumulate(cnt.begin(), cnt.end(), 0); int maxVal = *max_element(cnt.begin(), cnt.end()); res.emplace_back(total - maxVal); } return res; } };