力扣周赛代码分享
80 场双周
第一题
class Solution {
public:
bool strongPasswordCheckerII(string pd) {
string t = "!@#$%^&*()-+";
unordered_set<char> st;
for (char& c : t) st.insert(c);
int lf = 0, gf = 0, nf = 0, tf = 0, f = 1;
for (int i = 0; i < pd.size(); ++ i) {
char c = pd[i];
if (c >= 'a' && c <= 'z') lf = 1;
if (c >= 'A' && c <= 'Z') gf = 1;
if (c >= '0' && c <= '9') nf = 1;
if (st.count(c)) tf = 1;
if (i && pd[i] == pd[i - 1]) {
f = 0;
break;
}
}
if (lf && gf && nf && tf && f && pd.size() >= 8) return true;
return false;
}
};
第二题
class Solution {
public:
vector<int> successfulPairs(vector<int>& sl, vector<int>& ps, long long ss) {
sort(ps.begin(), ps.end());
vector<int> ret;
for (int& i : sl) {
int x = lower_bound(ps.begin(), ps.end(), (ss + i - 1) / i) - ps.begin();
ret.push_back(ps.size() - x);
}
return ret;
}
};
第三题
class Solution {
public:
bool matchReplacement(string s, string sb, vector<vector<char>>& ms) {
unordered_map<char, multiset<char>> mp;
for (auto& it : ms) {
mp[it[0]].insert(it[1]);
}
for (int i = 0; i <= s.size() - sb.size(); ++ i) {
int f = 1;
for (int k = i; k < s.size() && k - i < sb.size(); ++ k) {
if (s[k] != sb[k - i]) {
if (mp.count(sb[k - i]) && mp[sb[k - i]].count(s[k])) {
}else {
f = 0;
break;
}
}
}
if (f) return true;
}
return false;
}
};
第四题
#define ll long long
class Solution {
public:
long long countSubarrays(vector<int>& nums, long long k) {
int n = nums.size();
ll ret = 0;
int i = 0;
ll sum = 0;
for (int j = 0; j < n; j++) {
sum += nums[j];
while (i <= j && sum * (j - i + 1) >= k) {
sum -= nums[i];
i ++;
}
ret += j - i + 1;
}
return ret;
}
};
296 场单周
第一题
class Solution {
public:
int minMaxGame(vector<int>& nums) {
while (nums.size() > 1) {
vector<int> tt;
int f = 1;
for (int i = 0; i < nums.size(); i += 2) {
int t;
if (f) {
t = min(nums[i], nums[i + 1]);
f = 0;
}else {
t = max(nums[i], nums[i + 1]);
f = 1;
}
tt.push_back(t);
}
nums = tt;
}
return nums[0];
}
};
第二题
class Solution {
public:
int partitionArray(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int ret = 0;
for (int i = 0; i < nums.size(); ++ i) {
int j = i;
while (j < nums.size() && nums[j] - nums[i] <= k) ++ j;
i = j - 1;
++ ret;
}
return ret;
}
};
第三题
class Solution {
public:
static const int N = 1e6 + 5;
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
unordered_map<int, int> mp;
vector<int> arrayChange(vector<int>& nums, vector<vector<int>>& os) {
memset(h, -1, sizeof h);
for (int i = 0; i < nums.size(); ++ i) {
add(nums[i], i);
}
for (auto& it : os) {
int a = it[0], b = it[1];
int j = h[a];
while (ne[j] != -1) {
j = ne[j];
}
ne[j] = h[b];
h[b] = h[a];
h[a] = -1;
}
vector<int> ret(nums.size());
for (int i = 1; i <= 1e6; ++ i) {
for (int j = h[i]; j != -1; j = ne[j]) {
ret[e[j]] = i;
}
}
return ret;
}
};
第四题
class TextEditor {
vector<char> left, right;
public:
TextEditor() {
}
void addText(string text) {
left.insert(left.end(), text.begin(), text.end());
}
int deleteText(int k) {
int t = k;
while (k && left.size()) {
left.pop_back();
-- k;
}
return t - k;
}
string to_text() {
return string(next(left.begin(), max((int)left.size() - 10, 0)), left.end());
}
string cursorLeft(int k) {
while (k && left.size()) {
-- k;
right.push_back(left.back());
left.pop_back();
}
return to_text();
}
string cursorRight(int k) {
while (k && right.size()) {
left.push_back(right.back());
right.pop_back();
-- k;
}
return to_text();
}
};
/**
* Your TextEditor object will be instantiated and called as such:
* TextEditor* obj = new TextEditor();
* obj->addText(text);
* int param_2 = obj->deleteText(k);
* string param_3 = obj->cursorLeft(k);
* string param_4 = obj->cursorRight(k);
*/
295 场单周
第一题
class Solution {
public:
int rearrangeCharacters(string s, string t) {
int cnt[26];
memset(cnt, 0, sizeof cnt);
for (int i = 0; i < s.size(); ++ i) {
cnt[s[i] - 'a'] ++;
}
int cnt2[26];
memset(cnt2, 0, sizeof cnt2);
for (char c : t) {
cnt2[c - 'a'] ++;
}
int ret = 1e5;
for (char c : t) {
ret = min(ret, cnt[c - 'a'] / cnt2[c - 'a']);
}
return ret;
}
};
第二题
class Solution {
public:
string ToString(double val)//doule转string
{
stringstream ss;
ss << setiosflags(ios::fixed) << setprecision(2) << val;//保留两位小数
string str = ss.str();
return str;
}
string discountPrices(string s, int d) {
stringstream ss;
ss << s;
string ret;
while (ss) {
string t;
ss >> t;
if (ret.size() && t.size()) ret += " ";
if (t[0] == '$' && t.size() > 1) {
double x = 0;
int j = 1;
int f = 0;
while (j < t.size()) {
if (t[j] < '0' || t[j] > '9') {
f = 1;
break;
}
x *= 10;
x += (t[j] - '0');
++ j;
}
if (f) {
ret += t;
}else {
x = x * (100 - d) / 100;
string tt;
// tt = to_string(x);
// for (int j = 0; j < tt.size(); ++ j) {
// if (tt[j] == '.') {
// if (tt[j + 3] >= '5') {
// tt[j + 2] ++
// }
// tt = tt.substr(0, j + 3);
// }
// }
ret += "$" + ToString(x);
}
}else {
ret += t;
}
}
return ret;
}
};
第三题
class Solution {
public:
int totalSteps(vector<int>& nums) {
int ret = 0;
stack<pair<int, int> > st;
for (int num : nums) {
int mx = 0;
while (st.size() && st.top().first <= num) {
mx = max(st.top().second, mx);
st.pop();
}
if (st.size()) ++ mx;
ret = max(ret, mx);
st.push({num, mx});
}
return ret;
}
};
第四题
class Solution {
public:
static const int N = 1e6 + 5;
int dist[N];
int dx[4] = {0, 1, -1, 0};
int dy[4] = {1, 0, 0, -1};
int minimumObstacles(vector<vector<int>>& g) {
int n = g.size();
int m = g[0].size();
queue<int> q;
memset(dist, 0x3f, sizeof dist);
q.push(0);
dist[0] = 0;
while (q.size()) {
int sz = q.size();
for (int i = 0; i < sz; ++ i) {
int t = q.front();
q.pop();
int x = t / m;
int y = t % m;
for (int k = 0; k < 4; ++ k) {
int tx = x + dx[k];
int ty = y + dy[k];
if (tx < 0 || tx >= n || ty < 0 || ty >= m) continue;
int tot = tx * m + ty;
// cout << tot << endl;
if (dist[tot] > dist[t] + g[tx][ty]) {
q.push(tot);
dist[tot] = dist[t] + g[tx][ty];
}
}
}
}
return dist[(n - 1) * m + (m - 1)];
}
};
79 场双周
第一题
class Solution {
public:
bool digitCount(string num) {
int cnt[10];
memset(cnt, 0, sizeof cnt);
for (char& c : num) {
cnt[c - '0'] ++;
}
for (int i = 0; i < num.size(); ++ i) {
if ((num[i] - '0') != cnt[i]) return false;
}
return true;
}
};
第二题
class Solution {
public:
string largestWordCount(vector<string>& ms, vector<string>& ss) {
vector<pair<string, int>> ret;
map<string, int> mp;
for (int i = 0; i < ss.size(); ++ i) {
stringstream st;
st << ms[i];
int cnt = 0;
while (st) {
string t;
st >> t;
if (t.size()) ++ cnt;
}
// ret.push_back({ss[i], cnt});
mp[ss[i]] += cnt;
}
for (auto& [c, v] : mp) {
ret.push_back({c, v});
}
sort(ret.begin(), ret.end(), [](pair<string, int>& a, pair<string, int>& b) {
if (a.second != b.second) return a.second > b.second;
else {
return a.first > b.first;
}
});
return ret[0].first;
}
};
第三题
class Solution {
public:
long long maximumImportance(int n, vector<vector<int>>& rs) {
long long ret = 0;
unordered_map<int, int> mp;
for (auto it : rs) {
mp[it[0]] ++;
mp[it[1]] ++;
}
vector<int> tt;
for (auto& [c, v] : mp) {
tt.push_back(v);
}
sort(tt.begin(), tt.end());
// for (int i = n; i >)
int i = n;
for (int j = tt.size() - 1; j >= 0; -- j) {
// cout << tt[j] << " " << i << endl;
ret += (long long )tt[j] * i;
-- i;
}
return ret;
}
};
第四题
class BookMyShow {
static const int N = 1E5 + 5;
struct node{
int l, r;
long long sum = 0, val = 0;
}tr[N * 4];
void push_up(int u) {
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
tr[u].val = min(tr[u << 1].val, tr[u << 1 | 1].val);
}
void built(int u, int l, int r) {
tr[u] = {l, r};
if (l == r) return;
int mid = l + r >> 1;
built(u << 1, l, mid);
built(u << 1 | 1, mid + 1, r);
}
void add(int u, int idx, int val) {
if (tr[u].l == idx && tr[u].r == idx) {
tr[u].sum += val;
tr[u].val += val;
return;
}
int mid = tr[u].l + tr[u].r >> 1;
if (idx <= mid) {
add(u << 1, idx, val);
}else {
add(u << 1 | 1, idx, val);
}
push_up(u);
}
pair<int, int> look_for(int u, int val, int R) {
if (tr[u].val > val) return {-1, -1};
if (tr[u].l == tr[u].r) {
if (tr[u].l > R) {
return {-1, -1};
}
return {tr[u].l, tr[u].sum};
}
if (tr[u << 1].val <= val) {
return look_for(u << 1, val, R);
}else if (tr[u << 1 | 1].val <= val) {
return look_for(u << 1 | 1, val, R);
}
return {-1, -1};
}
long long query_sum(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) return tr[u].sum;
int mid = l + r >> 1;
long long ret = 0;
if (l <= mid) ret += query_sum(u << 1, l, r);
if (r > mid) ret += query_sum(u << 1 | 1, l, r);
return ret;
}
public:
int n, m;
BookMyShow(int n, int m) {
this->n = n, this->m = m;
built(1, 0, n - 1);
}
vector<int> gather(int k, int maxRow) {
pair<int, int> idx = look_for(1, m - k, maxRow);
if (idx.first == -1) return {};
add(1, idx.first, k);
return {idx.first, idx.second};
}
bool scatter(int k, int maxRow) {
long long ret = query_sum(1, 0, maxRow);
// if (maxRow == 0)
// cout << ret << endl;
if ((long long)m * (maxRow + 1) - ret < k) return false;
while (k) {
// if (maxRow == 0)
// cout << k << endl;
auto it = look_for(1, m - 1, maxRow);
long long res = (m - it.second);
if (k <= res) {
add(1, it.first, k);
k -= k;
}else {
add(1, it.first, res);
k -= res;
}
}
return true;
}
};
/**
* Your BookMyShow object will be instantiated and called as such:
* BookMyShow* obj = new BookMyShow(n, m);
* vector<int> param_1 = obj->gather(k,maxRow);
* bool param_2 = obj->scatter(k,maxRow);
*/
293 场单周
第一题
class Solution {
public:
vector<string> removeAnagrams(vector<string>& words) {
vector<string> ret;
ret.push_back(words[0]);
for (int i = 1; i < words.size(); ++ i) {
string s = ret.back();
sort(s.begin(), s.end());
string t = words[i];
sort(t.begin(), t.end());
if (t == s) continue;
else ret.push_back(words[i]);
}
return ret;
}
};
第二题
class Solution {
public:
int maxConsecutive(int bm, int top, vector<int>& sl) {
int ret = 0;
sort(sl.begin(), sl.end());
for (int i = 1; i < sl.size(); ++ i) {
ret = max(sl[i] - sl[i - 1] - 1, ret);
}
ret = max(ret, sl[0] - bm);
ret = max(ret, top - sl[sl.size() - 1]);
return ret;
}
};
第三题
class Solution {
public:
int largestCombination(vector<int>& c) {
int cnt[28];
memset(cnt, 0, sizeof cnt);
int ret = 0;
for (int& x : c) {
for (int i = 0; i < 28; ++ i) {
if (x >> i & 1) {
++ cnt[i];
ret = max(ret, cnt[i]);
}
}
}
return ret;
}
};
第四题
#define ls(x) tr[x].L
#define rs(x) tr[x].R
class CountIntervals {
static const int N = 8e5 + 5;
struct node{
int l, r, cnt = 0;
int L = -1, R = -1;
}tr[N];
int idx = 1;
void push_up(int u) {
tr[u].cnt = 0;
if (ls(u) != -1) {
tr[u].cnt += tr[ls(u)].cnt;
}
if (rs(u) != -1) {
tr[u].cnt += tr[rs(u)].cnt;
}
}
void add2(int u, int l, int r) {
if (tr[u].l == tr[u].r) {
tr[u].cnt = 1;
return;
}
if (l <= tr[u].l && r >= tr[u].r) {
tr[u].cnt = tr[u].r - tr[u].l + 1;
return;
}
if (tr[u].cnt == tr[u].r - tr[u].l + 1) return;
int mid = (tr[u].l + tr[u].r) >> 1;
if (l <= mid) {
int& L = ls(u);
if (L == -1) {
L = idx ++;
tr[L] = {tr[u].l, mid};
}
add2(L, l, r);
}
if (r > mid) {
int& R = rs(u);
if (R == -1) {
R = idx ++;
tr[R] = {mid + 1, tr[u].r};
}
add2(R, l, r);
}
push_up(u);
}
public:
CountIntervals() {
tr[idx ++] = {1, 1000000005, 0};
}
void add(int left, int right) {
add2(1, left, right);
// cout << idx << endl;
}
int count() {
// cout << idx << endl;
return tr[1].cnt;
}
};
/**
* Your CountIntervals object will be instantiated and called as such:
* CountIntervals* obj = new CountIntervals();
* obj->add(left,right);
* int param_2 = obj->count();
*/
78 场双周
第一题
class Solution {
public:
int divisorSubstrings(int num, int k) {
string s = to_string(num);
int n = s.size();
for (int len = k; len <= k; ++ len) {
int cnt = 0;
for (int i = 0; i + len - 1 < n; ++ i) {
int t = 0;
for (int j = i; j < i + len; ++ j) {
t *= 10;
t += s[j] - '0';
}
if (t && num % t == 0) ++ cnt;
}
return cnt;
}
return 0;
}
};
第二题
class Solution {
public:
int waysToSplitArray(vector<int>& nums) {
long long sum = 0;
for (int& x : nums) sum += x;
long long cur = 0;
int ret = 0;
for (int i = 0; i < nums.size() - 1; ++ i) {
cur += nums[i];
if (cur >= sum - cur) ++ ret;
}
return ret;
}
};
第三题
class Solution {
public:
int maximumWhiteTiles(vector<vector<int>>& ts, int cn) {
-- cn;
sort(ts.begin(), ts.end(), [](vector<int>& a, vector<int>& b) {
return a[0] < b[0];
});
// long long sum = 0;
for (int i = 0; i < ts.size(); ++ i) {
ts[i].push_back(ts[i][1] - ts[i][0] + 1);
// sum += ts[i][2];
}
int ret = 0;
// cout << ts[0][0] << " " << ts[ts.size() - 1][1] << endl;
// cout << sum << " " << ts[0][2] << " " << ts[10][2] << endl;
// sum = 0;
// for (int i = 1; i < ts.size() - 1; ++ i) {
// sum += ts[i][2];
// }
// cout << sum << endl;
for (int i = 0; i < ts.size(); ++ i) {
int t = ts[i][0] + cn;
int l = i, r = ts.size();
while (l < r) {
int mid = l + r >> 1;
if (ts[mid][0] <= t) {
l = mid + 1;
}else {
r = mid;
}
}
-- l;
// cout << i << " " << l << " " << ts.size() << endl;
int cnt = 0;
for (int j = i + 1; j < l; ++ j) {
cnt += ts[j][2];
}
// cout << cnt << endl;
cnt += min((int)ts[i][2], t - ts[i][0] + 1);
// cout << ts[i][1] << " " << ts[i][0] << " " << ts[i].size() << endl;
// cout << cnt << endl;
if (l > i)
cnt += min((int)ts[l][2], t - ts[l][0] + 1);
// cout << t << " " << l << " " << cnt << endl;
// cout << cnt << endl;
ret = max(ret, cnt);
if (t >= ts[ts.size() - 1][1]) return ret;
}
for (int i = ts.size() - 1; i >= 0; -- i) {
int t = ts[i][1] - cn;
int l = i, r = -1;
while (l > r) {
int mid = (l + r + 1) >> 1;
if (ts[mid][1] > t) {
l = mid - 1;
}else {
r = mid;
}
}
++ l;
int cnt = 0;
for (int j = i - 1; j > l; -- j) {
cnt += ts[j][2];
}
cnt += min((int)ts[i][2], ts[i][1] - t + 1);
// cout << cnt << endl;
// ut << ts[i][1] << " " << ts[i][0] << " " << ts[i].size() << endl;
if (l < i)
cnt += min((int)ts[l][2], ts[l][1]- t + 1);
// cout << t << " " << l << " " << cnt << endl;
ret = max(ret, cnt);
}
return ret;
}
};
第四题
class Solution {
public:
int largestVariance(string s) {
int ret = 0;
int n = s.size();
for (int i = 'a'; i <= 'z'; ++ i) {
for (int j = 'a'; j <= 'z'; ++ j) {
if (i == j) continue;
for (int k = 0, dp0 = -1e8, dp1 = -1e8; k < n; ++ k) {
int v = 0;
if (s[k] == i) v = 1;
else if (s[k] == j) v = -1;
if (v == -1) {
dp1 = max(dp0 + v, v);
}else {
dp1 = dp1 + v;
}
dp0 = max(dp0 + v, v);
ret = max(ret, dp1);
}
}
}
return ret;
}
};
56 场双周
第一题
class Solution {
public:
int countTriples(int n) {
int ret = 0;
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
if (j == i) continue;
for (int k = 1; k <= n; ++ k) {
if (k == i || k == j) continue;
if (i * i + j * j == k * k) ++ ret;
}
}
}
return ret;
}
};
第二题
#define x first
#define y second
class Solution {
public:
int dx[4] = {0, 1, -1, 0};
int dy[4] = {-1, 0, 0, 1};
pair<int, int> q[100005];
int nearestExit(vector<vector<char>>& me, vector<int>& e) {
// queue<pair<int, int> > q;
// q.push({e[0], e[1]});
q[0] = {e[0], e[1]};
int cnt = 0;
int n = me.size();
int m = me[0].size();
me[e[0]][e[1]] = '+';
int hh = 0, tt = 0;
while (hh <= tt) {
// int sz = q.size();
int sz = tt - hh + 1;
for (int i = 0; i < sz; ++ i) {
// auto& t = q.front();
// q.pop();
auto& t = q[hh ++];
// cout << t.x << " " << t.y << " " << endl;
for (int k = 0; k < 4; ++ k) {
int xt = t.x + dx[k];
int yt = t.y + dy[k];
if (xt < 0 || xt >= n || yt < 0 || yt >= m) {
if (cnt) return cnt;
continue;
}
if (me[xt][yt] == '+') continue;
me[xt][yt] = '+';
// q.push({xt, yt});
q[++ tt] = {xt, yt};
}
}
if (tt - hh + 1 > 0)
++ cnt;
}
return -1;
}
};
第三题
class Solution {
public:
bool sumGame(string num) {
int lq = 0, lcnt = 0, rq = 0, rcnt = 0;
for (int i = 0; i < num.size(); ++ i) {
if (i < num.size() / 2) {
if (num[i] == '?') {
++ lq;
}else {
lcnt += num[i] - '0';
}
}else {
if (num[i] == '?') {
++ rq;
}else {
rcnt += num[i] - '0';
}
}
}
if (lcnt == rcnt) {
return lq != rq;
}
else if (lcnt < rcnt) {
swap(lcnt, rcnt);
swap(lq, rq);
}
if (lq >= rq) return true;
lcnt -= rcnt;
rq -= lq;
// cout << lcnt << " " << rq<< endl;
int b = rq / 2;
int a = rq - b;
if (lcnt >= a * 9 && lcnt <= b * 9) return false;
return true;
}
};
第四题
class Solution {
public:
static const int N = 1E3 + 5;
int dist[N][N];
int minCost(int me, vector<vector<int>>& es, vector<int>& ps) {
memset(dist, 0x3f, sizeof dist);
dist[0][0] = ps[0];
for (int i = 1; i <= me; ++ i) {
for (auto& it : es) {
int a = it[0], b = it[1], c = it[2];
if (i - c >= 0) {
dist[i][a] = min(dist[i][a], dist[i - c][b] + ps[a]);
dist[i][b] = min(dist[i][b], dist[i - c][a] + ps[b]);
}
}
}
int ret = 1e6 + 5;
for (int i = 0; i <= me; ++ i) {
ret = min(ret, dist[i][ps.size() - 1]);
}
return ret == 1e6 + 5 ? -1 : ret;
}
};
292 场周赛
第一题
class Solution {
public:
string largestGoodInteger(string num) {
string ret = "";
for (int i = 0; i < num.size(); ++ i) {
string t = num.substr(i, 3);
if (t[0] == t[1] && t[0] == t[2] && t > ret) {
ret = t;
}
}
return ret;
}
};
第二题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int ret = 0;
pair<int, int> dfs(TreeNode* root) {
pair<int, int> l = {0, 0}, r = {0, 0};
if (root->left) {
l = dfs(root->left);
}
if (root->right) {
r = dfs(root->right);
}
int v = root->val;
if (v == (l.first + r.first + v) / (l.second + r.second + 1) ) ++ ret;
return {v + l.first + r.first, l.second + r.second + 1};
}
int averageOfSubtree(TreeNode* root) {
dfs(root);
return ret;
}
};
第三题
class Solution {
public:
static const int N = 1E5 + 5;
int f[N], g[N];
int countTexts(string ps) {
f[0] = 1;
g[0] = 1;
int p = 1e9 + 7;
for (int i = 1; i < N; ++ i) {
for (int j = 1; j <= 3; ++ j) {
if (i >= j) f[i] = (f[i] + f[i - j]) % p;
}
for (int j = 1; j <= 4; ++ j) {
if (i >= j) g[i] = (g[i] + g[i - j]) % p;
}
}
long long ret = 1;
for (int i = 0; i < ps.size(); ++ i) {
int j = i;
while (j < ps.size() && ps[j] == ps[i]) {
++ j;
}
if (ps[i] == '7' || ps[i] == '9') ret *= g[j - i];
else ret *= f[j - i];
ret %= p;
i = j - 1;
}
return ret;
}
};
第四题
** 动态规划的本质就是有剪枝的暴力枚举**
一般学习方法:写出暴力枚举 --> 剪枝暴力枚举 --> 写成循环的方式
剪枝推荐题解
循环推荐题解
// 超时
class Solution {
public:
vector<vector<char> > g;
bool dfs(int x, int y, int cnt) {
if (x >= g.size() || y >= g[0].size()) return false;
if (g[x][y] == '(') {
++ cnt;
}else -- cnt;
if (cnt < 0) return false;
if (x == g.size() - 1 && y == g[0].size() - 1) {
return cnt == 0;
}
return dfs(x + 1, y, cnt) || dfs(x, y + 1, cnt);
}
bool hasValidPath(vector<vector<char>>& grid) {
this->g = grid;
return dfs(0, 0, 0);
}
};
// 剪枝
class Solution {
public:
vector<vector<char> > g;
unordered_map<int, int> mp;
bool dfs(int x, int y, int cnt) {
int n = g.size(), m = g[0].size();
if (x >= g.size() || y >= g[0].size()) return false;
int k = (x * m + y) * m + cnt;
if (mp[(x * m + y) * m + cnt]) return mp[k] == 1;
if (g[x][y] == '(') {
++ cnt;
}else -- cnt;
if (cnt < 0) return false;
if (x == g.size() - 1 && y == g[0].size() - 1) {
return cnt == 0;
}
bool t = dfs(x + 1, y, cnt) || dfs(x, y + 1, cnt);
if (t) {
mp[k] = 1;
}else mp[k] = 2;
return mp[k] == 1;
}
bool hasValidPath(vector<vector<char>>& grid) {
this->g = grid;
return dfs(0, 0, 0);
}
};
// 循环
class Solution {
public:
static const int N = 2e2 + 5;
int dp[N][N][N];
bool hasValidPath(vector<vector<char>>& grid) {
if (grid[0][0] == ')') return false;
int n = grid.size(), m = grid[0].size();
dp[0][0][1] = 1;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (i || j) {
int t = grid[i][j] == '('? 1 : -1;
for (int k = 0; k < n + m; ++ k) {
if (k - t < 0) continue;
if (i)
dp[i][j][k] |= dp[i - 1][j][k - t];
if (j)
dp[i][j][k] |= dp[i][j - 1][k - t];
}
}
}
}
return dp[n - 1][m - 1][0];
}
};
132 场周赛
第一题
class Solution {
public:
bool divisorGame(int n) {
return n % 2 == 0;
}
};
第二题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int ret = 0;
vector<int> dfs(TreeNode* root) {
int lmin = 1e5 + 5, rmin = 1e5 + 5;
int lmax = -1, rmax = -1;
if (root->left) {
auto it = dfs(root->left);
lmin = it[0];
lmax = it[1];
}
if (root->right) {
auto it = dfs(root->right);
rmin = it[0];
rmax = it[1];
}
int xmin = min(lmin, rmin);
int xmax = max(lmax, rmax);
int v = root->val;
if (xmin != 1e5 + 5)
ret = max(ret, abs(v - xmin));
if (xmax != -1) {
ret = max(ret, abs(v - xmax));
}
return {min(v, xmin), max(v, xmax)};
}
int maxAncestorDiff(TreeNode* root) {
dfs(root);
return ret;
}
};
第三题
补题中...
第四题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* recoverFromPreorder(string t) {
stack<TreeNode*> stk;
int num = 0;
int i = 0;
while (i < t.size() && t[i] != '-') {
num *= 10;
num += t[i] - '0';
++ i;
}
TreeNode* node = new TreeNode(num);
if (i == t.size()) return node;
stk.push(node);
for (i; i < t.size();) {
int cnt = 0;
while (t[i] == '-'){
++ cnt;
++ i;
}
int num = 0;
while (i < t.size() && t[i] != '-') {
num *= 10;
num += t[i] - '0';
++ i;
}
TreeNode* n = new TreeNode((int)(num));
while (cnt < stk.size()) {
stk.pop();
}
if (stk.top()->left != NULL) {
stk.top()->right = n;
}else {
stk.top()->left = n;
}
stk.push(n);
}
return node;
}
};
215 场周赛
第一题
class OrderedStream {
public:
vector<string> st;
OrderedStream(int n) {
st.assign(n + 5, "");
}
int p = 0;
vector<string> insert(int id, string v) {
st[id - 1] = v;
vector<string> ret;
//for (int i = 0; i < st.size(); ++ i) cout << st[i] << endl;
// cout << st[0] << endl;
while (st[p] != "") {
ret.push_back(st[p]);
++ p;
}
return ret;
}
};
/**
* Your OrderedStream object will be instantiated and called as such:
* OrderedStream* obj = new OrderedStream(n);
* vector<string> param_1 = obj->insert(idKey,value);
*/
第二题
class Solution {
public:
bool closeStrings(string w1, string w2) {
unordered_set<char> st;
int cnt[26];
memset(cnt, 0, sizeof cnt);
vector<int> ww1;
for (char& c : w1) {
st.insert(c);
cnt[c - 'a'] ++;
}
for (int i = 0; i < 26; ++ i) {
ww1.push_back(cnt[i]);
}
memset(cnt, 0, sizeof cnt);
vector<int> ww2;
for (char& c : w2) {
cnt[c - 'a'] ++;
if (st.count(c) == 0) return false;
}
for (int i = 0; i < 26; ++ i) {
ww2.push_back(cnt[i]);
}
sort(ww1.begin(), ww1.end());
sort(ww2.begin(), ww2.end());
if (ww1.size() != ww2.size()) return false;
for (int i = 0; i < ww1.size(); ++ i) {
if (ww1[i] != ww2[i]) return false;
}
return true;
}
};
第三题
class Solution {
public:
int minOperations(vector<int>& nums, int x) {
int ret = 1e5 + 5;
int i = 0, j = nums.size() - 1;
while (i < nums.size() && x > 0) {
x -= nums[i ++];
}
if (x == 0)
ret = i;
if (x > 0 && i > j) return -1;
-- i;
while (j >= 0) {
x -= nums[j];
while (i >= 0 && x < 0) {
x += nums[i --];
}
if (x == 0) {
ret = min(ret, i + 1 + (int)nums.size() - j);
}
-- j;
}
return ret == 1e5 + 5 ? -1 : ret;
}
};
第四题
class Solution {
public:
int dp[26][7][7][250];
int offset[3][3] = {0, 0, 0, 0, -60, -10, 0, -10, 40};
int cases, cases1, m, n;
int dfs(int cur, int a, int b, int status) {
if (cur == m * n) return 0;
if (dp[cur][a][b][status] != -1) return dp[cur][a][b][status];
int x = cur / n, y = cur % n;
//first是当前位置(x, y)的上面位置(x - 1, y)的状态,
//last是指当前位置前一个位置放人的状态(当y == 0时则没有前一个位置)
int first = status / cases1, last = status % 3;
int nexs = (status * 3) % cases; //(左移并去掉status的首位)
//当前位置不放人
int ans = dfs(cur + 1, a, b, nexs);
//当前位置放内向的人。
int dif = 0;
if (a > 0) {
dif = 120 + offset[1][first] + (y > 0) * offset[1][last];
ans = max(ans, dif + dfs(cur + 1, a - 1, b, nexs + 1));
}
//当前位置放外向的人。
if (b > 0) {
dif = 40 + offset[2][first] + (y > 0) * offset[2][last];
ans = max(ans, dif + dfs(cur + 1, a, b - 1, nexs + 2));
}
return dp[cur][a][b][status] = ans;
}
int getMaxGridHappiness(int m, int n, int a, int b) {
// 0- 不放人 1-放内向 2-放外向 3^n
cases = pow(3, n);
cases1 = pow(3, n-1);
memset(dp, -1, sizeof(dp));
this->m = m;
this->n = n;
return dfs(0, a, b, 0);
}
};
46 场双周
第一题
class Solution {
public:
string longestNiceSubstring(string s) {
if (s.size() < 2) return "";
for (int len = s.size(); len >= 2; -- len) {
for (int i = 0; i + len - 1 < s.size(); ++ i) {
int cnt1[26], cnt2[26];
for (int i = 0; i < 26; ++ i) {
cnt1[i] = 1;
cnt2[i] = 1;
}
int cnt3[26];
memset(cnt3, 0, sizeof cnt3);
for (int j = i; j < i + len; ++ j) {
char c = s[j];
if (s[j] >= 'a' && s[j] <= 'z') {
if (cnt1[c - 'a']) {
cnt3[c - 'a'] += cnt1[c - 'a'];
cnt1[c - 'a'] = 0;
}
}
else {
if (cnt2[c - 'A']) {
cnt3[c - 'A'] += cnt2[c - 'A'];
cnt2[c - 'A'] = 0;
}
}
}
int f = 1;
for (int i = 0; i < 26; ++ i) {
if (cnt3[i] % 2) {
f = 0;
break;
}
}
if (f) return s.substr(i, len);
}
}
return "";
}
};
第二题
class Solution {
public:
bool canChoose(vector<vector<int>>& gs, vector<int>& nums) {
int j = 0;
for (int i = 0; i < nums.size(); ++ i) {
int k = i;
while (k < nums.size() && k - i < gs[j].size() && nums[k] == gs[j][k - i]) {
++ k;
}
if (k - i == gs[j].size()) {
++ j;
// cout << "j " << j << endl;
i = k - 1;
}
if (j == gs.size()) return true;
if (k == nums.size()) return false;
// cout << i << endl;
}
return false;
}
};
第三题
#define pii pair<int, int>
#define x first
#define y second
class Solution {
public:
static const int N = 1E6 + 5;
pii q[N];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
vector<vector<int>> highestPeak(vector<vector<int>>& ir) {
int n = ir.size();
int m = ir[0].size();
int hh = 0, tt = -1;
unordered_set<int> st;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (ir[i][j]) {
q[++ tt] = {i, j};
st.insert(i * m + j);
}
}
}
vector<vector<int>> ret(n, vector<int>(m));
int cnt = 0;
while (hh <= tt) {
int sz = tt - hh + 1;
++ cnt;
for (int i = 0; i < sz; ++ i) {
pii t = q[hh ++];
for (int k = 0; k < 4; ++ k) {
int xt = t.x + dx[k];
int yt = t.y + dy[k];
if (xt < 0 || xt >= n || yt < 0 || yt >= m || st.count(xt * m + yt)) continue;
// cout << xt << " " << yt << endl;
st.insert(xt * m + yt);
q[++ tt] = {xt, yt};
ret[xt][yt] = cnt;
// cout << "ok" << endl;
}
}
}
return ret;
}
};
第四题
class Solution {
public:
static const int N = 2e5 + 5;
int h[N], e[N], ne[N], idx;
vector<stack<pair<int, int> > > stk;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
vector<int> ret;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
vector<int> nums;
void dfs(int u, int f, int cnt) {
int ans = -1, lv = 0;
for (int i = 1; i <= 50; ++ i) {
if (stk[i].size() && stk[i].top().first > lv && gcd(i, nums[u]) == 1) {
lv = stk[i].top().first;
ans = stk[i].top().second;
}
}
// cout << u << " " << ans << " " << lv << endl;
ret[u] = ans;
stk[nums[u]].push({cnt, u});
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
dfs(j, u, cnt + 1);
}
stk[nums[u]].pop();
}
vector<int> getCoprimes(vector<int>& nums, vector<vector<int>>& edges) {
this->nums = nums;
stk.assign(55, stack<pair<int, int>>());
memset(h, -1, sizeof h);
ret.assign(nums.size(), -1);
for (auto& it : edges) {
add(it[0], it[1]);
add(it[1], it[0]);
}
dfs(0, -1, 1);
return ret;
}
};
161 场周赛
第一题
class Solution {
public:
int minimumSwap(string s1, string s2) {
int a1 = 0;//x -> y
int a2 = 0;//y -> x
for (int i = 0;i < s1.size();i++) {
if (s1[i] == 'x' && s2[i] == 'y') {
a1++;
}
if (s1[i] == 'y' && s2[i] == 'x') {
a2++;
}
}
if (a1 % 2 + a2 % 2 == 1) {
return -1;
}
int ret = a1 / 2 + a2 / 2;
if (a1 % 2 == 1) {
ret += 2;
}
return ret;
}
};
第二题
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int i = 0, j = 0;
int cnt = 0;
int ret = 0;
while (j < nums.size()) {
while (j < nums.size() && cnt < k) {
if (nums[j] & 1) ++ cnt;
++ j;
}
if (j == nums.size() && cnt < k) break;
while (i < nums.size() && cnt == k) {
if (nums[i] & 1) -- cnt;
++ i;
}
int l = i - 2, r = j;
while (l >= 0 && nums[l] % 2 == 0) {
-- l;
}
while (r < nums.size() && nums[r] % 2 == 0) {
++ r;
}
ret += (i - l - 1) * (r - j + 1);
}
return ret;
}
};
第三题
class Solution {
public:
string minRemoveToMakeValid(string s) {
string ret;
int cnt = 0;
for (char& c : s) {
if (c == '(') ++ cnt;
else if (c == ')') -- cnt;
if (cnt >= 0) {
ret += c;
}else {
cnt = 0;
}
}
s = ret;
cnt = 0;
ret = "";
for (int i = s.size() - 1; i >= 0; -- i) {
char c = s[i];
if (c == ')') ++ cnt;
else if (c == '(') -- cnt;
if (cnt >= 0) {
ret += c;
}else {
cnt = 0;
}
}
reverse(ret.begin(), ret.end());
return ret;
}
};
第四题
class Solution {
public:
int gcd(int a, int b) {
return b? gcd(b, a % b) : a;
}
bool isGoodArray(vector<int>& nums) {
int d = nums[0];
for (int& i : nums) {
d = gcd(i, d);
}
return d == 1;
}
};
291 场周赛
第一题
class Solution {
public:
string removeDigit(string number, char digit) {
string ret;
for (int i = 0; i < number.size(); ++ i) {
if (number[i] == digit) {
string t = number.substr(0, i) + number.substr(i + 1, number.size() - i - 1);
ret = max(ret, t);
}
}
return ret;
}
};
第二题
class Solution {
public:
static const int N = 1e6 + 5;
int mp[N];
int minimumCardPickup(vector<int>& c) {
int ret = 1e5 + 2;
memset(mp, -1, sizeof mp);
for (int i = 0; i < c.size(); ++ i) {
if (mp[c[i]] != -1) {
ret = min(ret, i - mp[c[i]] + 1);
}
mp[c[i]] = i;
}
return ret == 1e5 + 2 ? -1 : ret;
}
};
第三题
class Solution {
public:
int countDistinct(vector<int>& nums, int k, int p) {
unordered_set<string> st;
for (int len = 1; len <= nums.size(); ++ len) {
int i = 0, j = 0;
string t;
int cnt = 0;
while (j < nums.size()) {
while (j - i < len) {
t += to_string(nums[j]);
t += "_";
if (nums[j] % p == 0) ++ cnt;
++ j;
}
if (cnt <= k) {
st.insert(t);
}
int u = 0;
while (u < t.size() && t[u] != '_') ++ u;
if (u < t.size() - 1) {
t = t.substr(u + 1, t.size() - u - 1);
}else {
t = "";
}
if (nums[i] % p == 0) -- cnt;
++ i;
}
}
return st.size();
}
};
第四题
class Solution {
public:
int mp[26];
long long appealSum(string s) {
long long ret = 0;
memset(mp, -1, sizeof mp);
for (int i = 0; i < s.size(); ++ i) {
mp[s[i] - 'a'] = max(i, mp[s[i] - 'a']);
// priority_queue<int, vector<int>, greater<int> > q;
vector<int> d;
for (int j = 0; j < 26; ++ j) {
if (mp[j] != -1) {
// q.push(mp[j]);
d.push_back(mp[j]);
}
}
sort(d.begin(), d.end(), [](int& a, int& b){
return a > b;
});
int last = -1;
// while (q.size()) {
// ret += (q.top() - last) * q.size();
// last = q.top();
// q.pop();
// }
while (d.size()) {
ret += (d.back() - last) * d.size();
last = d.back();
d.pop_back();
}
}
return ret;
}
};
77 场双周
第一题
class Solution {
public:
int countPrefixes(vector<string>& words, string s) {
unordered_set<string> st;
for (int i = 1; i <= s.size(); ++ i) {
st.insert(s.substr(0, i));
}
int ret = 0;
for (string& t : words) {
if (st.count(t)) ++ ret;
}
return ret;
}
};
第二题
class Solution {
public:
int minimumAverageDifference(vector<int>& nums) {
int n = nums.size();
vector<long long> pre(nums.size() + 1);
for (int i = nums.size() - 1; i >= 0; -- i) {
pre[i] = pre[i + 1] + nums[i];
}
long long tot = 0;
long long mx = 1e10;
int ret = 0;
for (int i = 0; i < nums.size(); ++ i) {
tot += nums[i];
long long t = abs(tot / (i + 1) - (pre[i] - nums[i]) / max(1, (n - i - 1)) );
if (t < mx) {
mx = t;
ret = i;
}
}
return ret;
}
};
第三题
class Solution {
public:
int countUnguarded(int m, int n, vector<vector<int>>& gs, vector<vector<int>>& ws) {
vector<vector<int> > g(m, vector<int>(n));
for (auto& it : ws) {
g[it[0]][it[1]] = 1;
}
for (auto& it : gs) {
g[it[0]][it[1]] = 1;
}
for (auto& it : gs) {
int x = it[0], y = it[1];
for (int i = x - 1; i >= 0; -- i) {
if (g[i][y] == 1) break;
g[i][y] = 2;
}
for (int i = x + 1; i < m; ++ i) {
if (g[i][y] == 1) break;
g[i][y] = 2;
}
for (int j = y - 1; j >= 0; -- j) {
if (g[x][j] == 1) break;
g[x][j] = 2;
}
for (int j = y + 1; j < n; ++ j) {
if (g[x][j] == 1) break;
g[x][j] = 2;
}
g[x][y] = 1;
}
int ret = 0;
for (int i = 0; i < m; ++ i) {
for (int j = 0; j < n; ++ j) {
if (g[i][j] == 0) ++ ret;
}
}
return ret;
}
};
第四题
class Solution {
public:
vector<vector<int> > f;
int dx[4] = {0, 1, -1, 0};
int dy[4] = {-1, 0, 0, 1};
bool check(int x, vector<vector<int> > g) {
queue<vector<int>> q;
vector<vector<int> > ft = f;
for (auto& it : f) {
q.push(it);
}
if (x)
while (q.size()) {
int sz = q.size();
for (int i = 0; i < sz; ++ i) {
auto t = q.front();
q.pop();
for (int k = 0; k < 4; ++ k) {
int tx = t[0] + dx[k];
int ty = t[1] + dy[k];
if (tx < 0 || tx >= g.size() || ty < 0 || ty >= g[0].size() || g[tx][ty]) continue;
g[tx][ty] = 1;
q.push({tx, ty});
}
}
if (-- x == 0) break;
}
// for (int i = 0; i < g.size(); ++ i) {
// for (int j = 0; j < g[0].size(); ++ j) {
// cout << g[i][j] << " ";
// }
// cout << endl;
// }
// cout << endl;
queue<vector<int> > q2;
q2.push({0, 0});
g[0][0] = 3;
while (q2.size()) {
int f = 0;
int sz = q.size();
for (int i = 0; i < sz; ++ i) {
auto t = q.front();
q.pop();
for (int k = 0; k < 4; ++ k) {
int tx = t[0] + dx[k];
int ty = t[1] + dy[k];
if (tx < 0 || tx >= g.size() || ty < 0 || ty >= g[0].size() || g[tx][ty] == 1 || g[tx][ty] == 2) continue;
if (tx == g.size() - 1 && ty == g[0].size() - 1) {
f = 1;
}
else
g[tx][ty] = 1;
q.push({tx, ty});
}
}
sz = q2.size();
// cout << sz << endl;
for (int i = 0; i < sz; ++ i) {
auto t = q2.front();
q2.pop();
for (int k = 0; k < 4; ++ k) {
int tx = t[0] + dx[k];
int ty = t[1] + dy[k];
if (tx < 0 || tx >= g.size() || ty < 0 || ty >= g[0].size() || g[tx][ty]) continue;
g[tx][ty] = 3;
// cout << "-> "<< " " << tx << " " << ty << " " << g[tx][ty] << endl;
if (tx == g.size() - 1 && ty == g[0].size() - 1) return true;
q2.push({tx, ty});
}
}
if (f) return false;
// for (int i = 0; i < g.size(); ++ i) {
// for (int j = 0; j < g[0].size(); ++ j) {
// cout << g[i][j] << " ";
// }
// cout << endl;
// }
// cout << endl;
}
return false;
}
int maximumMinutes(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (grid[i][j] == 1) {
f.push_back({i, j});
// cout << i << " " << j << " " << grid[i][j] << endl;
}
}
}
// if (check(0, grid)) {
// cout << "yes" << endl;
// }else {
// cout << "NO" << endl;
// }
int l = 0, r = 2e4 + 5;
while (l < r) {
int mid = l + r >> 1;
if (check(mid, grid)) {
l = mid + 1;
}else {
r = mid;
}
}
if (l == 2e4 + 5) return 1e9;
return -- l;
}
};
55 场双周
第一题
class Solution {
public:
static const int N = 1005;
int dp[N];
bool canBeIncreasing(vector<int>& nums) {
int mx = 0;
for (int i = 0; i < nums.size(); ++ i) {
dp[i] = 1;
for (int j = 0; j < i; ++ j) {
if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
}
mx = max(dp[i], mx);
}
return mx == nums.size() || mx == nums.size() - 1;
}
};
第二题
class Solution {
public:
string removeOccurrences(string s, string p) {
string ret;
for (int i = 0; i < s.size(); ++ i) {
ret += s[i];
// if (ret.size() >= p.size()) {
// cout << ret.substr(ret.size() - p.size(), p.size()) << endl;
// }
while(ret.size() >= p.size() && ret.substr(ret.size() - p.size(), p.size()) == p) {
ret = ret.substr(0, ret.size() - p.size());
}
}
return ret;
}
};
第三题
class Solution {
public:
long long maxAlternatingSum(vector<int>& nums) {
if (nums.size() == 1) return nums[0];
vector<int> ret;
for (int i = 0, j = 1; j < nums.size(); ) {
if (nums[j] >= nums[j - 1]) {
while (j < nums.size() && nums[j] >= nums[j - 1]) {
++ j;
}
ret.push_back(nums[j - 1]);
i = j - 1;
}
else {
if (i == 0) {
ret.push_back(nums[i]);
}
while (j < nums.size() && nums[j] < nums[j - 1]) {
++ j;
}
ret.push_back(nums[j - 1]);
i = j - 1;
}
}
long long tt = 0;
for (int i = 0; i < ret.size(); ++ i) {
// cout << ret[i] << endl;
if (i & 1) {
tt -= ret[i];
}else tt += ret[i];
}
if (ret.size() % 2 == 0) {
tt += ret.back();
}
return tt;
}
};
第四题
补题中...
107 场单周
第一题
#define ull unsigned long long
class Solution {
public:
static const int N = 3E5 + 5;
const int sp = 131;
ull h[N], p[N];
ull get(int l, int r) {
return h[r] - h[l - 1] * p[r - l + 1];
}
vector<int> threeEqualParts(vector<int>& arr) {
p[0] = 1;
for (int i = 1; i <= n; ++ i) {
h[i] = h[i - 1] * sp + s[i - 1];
p[i] = p[i - 1] * sp;
}
}
};
第二题
class Solution {
public:
int minFlipsMonoIncr(string s) {
vector<int> stk;
for (char& c : s) {
int x = c - '0';
int l = 0, r = stk.size();
while (l < r) {
int mid = l + r >> 1;
if (stk[mid] <= x) {
l = mid + 1;
}else r = mid;
}
if (l == stk.size()) {
stk.push_back(x);
}else {
stk[l] = x;
}
}
return s.size() - stk.size();
}
};
第三题
class Solution {
public:
vector<int> threeEqualParts(vector<int>& arr) {
int cnt = 0;
for (int& i : arr)
if (i) ++ cnt;
if (cnt % 3 != 0) return {-1, -1};
if (cnt == 0) return {0, (int)arr.size() - 1};
cnt /= 3;
int b1, b2, b3;
int cur = 0;
for (int i = 0; i < arr.size(); ++ i) {
if (cur == 0) b1 = i;
else if (cur == cnt) b2 = i;
else if (cur == cnt * 2) b3 = i;
else if (cur > cnt * 2) break;
if (arr[i]) ++ cur;
}
int len = arr.size() - b3;
for (int i = 0; i < len; ++ i) {
if (arr[b1 + i] != arr[b2 + i] || arr[b1 + i] != arr[b3 + i]) {
return {-1, -1};
}
}
return {b1 + len - 1, b2 + len};
}
};
第四题
class Solution {
public:
static const int N = 305;
int fa[N], sz[N];
int find(int x) {
return fa[x] == -1 ? x : fa[x] = find(fa[x]);
}
void merge(int a, int b) {
a = find(a), b = find(b);
if (a != b) {
fa[b] = a;
sz[a] += sz[b];
}
}
int minMalwareSpread(vector<vector<int>>& g, vector<int>& it) {
memset(fa, -1, sizeof fa);
for (int i = 0; i < N; ++ i) {
sz[i] = 1;
}
for (int i = 0; i < g.size(); ++ i) {
for (int j = 0; j < g[0].size(); ++ j) {
if (g[i][j] && !count(it.begin(), it.end(), i) && !count(it.begin(), it.end(), j)) {
merge(i, j);
}
}
}
// cout << sz[1] << endl;
int ret= 0;
int mx = 10000;
for (int i = 0; i < it.size(); ++ i) {
unordered_set<int> st;
int cnt = 0;
for (int j = 0; j < it.size(); ++ j) {
if (j == i) continue;
cnt ++;
for (int k = 0; k < g.size(); ++ k) {
if (count(it.begin(), it.end(), k) || g[it[j]][k] == 0) continue;
int f = find(k);
if (st.count(f)) continue;
st.insert(f);
cnt += sz[f];
}
}
// cout << cnt << endl;
if (cnt <= mx) {
if (cnt < mx)
ret = it[i];
else ret = min(ret, it[i]);
mx = cnt;
}
}
return ret;
}
};
39 场双周
第一题
class Solution {
public:
vector<int> decrypt(vector<int>& c, int k) {
vector<int> code = c;
int n = code.size();
for (int i : c) {
code.push_back(i);
}
vector<int> ret;
for (int i : c) {
code.push_back(i);
}
vector<int> pre(n * 3 + 1);
// cout << code.size() << " " << pre.size() << endl;
for (int i = 1; i <= code.size(); ++ i) {
pre[i] = pre[i - 1] + code[i - 1];
}
for (int i = n; i < 2 * n; ++ i) {
if (k == 0)
ret.push_back(0);
else if (k > 0) {
ret.push_back(pre[i + k + 1] - pre[i + 1]);
}else {
ret.push_back(pre[i] - pre[i + k]);
}
}
return ret;
}
};
第二题
class Solution {
public:
static const int N = 1E5 + 5;
int minimumDeletions(string s) {
vector<int> c;
c.push_back(s[0]);
for (int i = 1; i < s.size(); ++ i) {
int l = 0, r = c.size();
while (l < r) {
int mid = l + r >> 1;
if (c[mid] <= s[i]) l = mid + 1;
else r = mid;
}
if (l == c.size()) {
c.push_back(s[i]);
}else {
c[l] = s[i];
}
}
// cout << c.size() << endl;
return s.size() - c.size();
}
};
第三题
class Solution {
public:
int minimumJumps(vector<int>& forbidden, int a, int b, int x) {
unordered_set<int> st;
for (int i : forbidden) st.insert(i);
queue<pair<int, int>> q;
q.push({0, 0});
st.insert(0);
int ret = 0;
unordered_set<int> f;
unordered_set<int> bk;
while (q.size()) {
int sz = q.size();
for (int i = 0; i < sz; ++ i) {
auto t = q.front();
// cout << t.first << endl;
if (t.first == x) return ret;
q.pop();
if (t.first + a < 8000 && !f.count(t.first + a) && !st.count(t.first + a)) {
f.insert(t.first + a);
q.push({t.first + a, 0});
}
if (t.second == 0) {
if (t.first - b >= 0 && !bk.count(t.first - b) && !st.count(t.first - b)) {
bk.insert(t.first - b);
q.push({t.first - b, 1});
}
}
}
++ ret;
}
return -1;
}
};
第四题
class Solution {
public:
bool canDistribute(vector<int>& ns, vector<int>& qy) {
unordered_map<int, int> mp;
for (int& i : ns) {
mp[i] ++;
}
vector<int> cnt;
for (auto& [c, v] : mp)
cnt.push_back(v);
int n = cnt.size();
int m = qy.size();
vector<int> sum(1 << m, 0);
for (int i = 0; i < 1 << m; ++ i) {
for (int j = 0; j < m; ++ j) {
if (i >> j & 1) {
sum[i] += qy[j];
}
}
}
vector<vector<bool> > dp(n + 1, vector<bool>(1 << m, false));
dp[0][0] = true;
for (int i = 1; i <= n; ++ i) {
for (int j = 0; j < 1 << m; ++ j) {
dp[i][j] = dp[i - 1][j];
if (dp[i][j]) continue;
for (int m = j; m; m = (m - 1) & j) {
if (dp[i - 1][j - m] && sum[m] <= cnt[i - 1]) {
dp[i][j] = true;
break;
}
}
}
}
return dp[n][(1 << m) - 1];
}
};
290 场周赛
第一题
class Solution {
public:
vector<int> intersection(vector<vector<int>>& nums) {
vector<int> ret;
unordered_map<int, int> mp;
for (auto& it : nums) {
for (int& i : it) {
mp[i] ++;
}
}
for (auto& [c, v] : mp) {
if (v == nums.size()) {
ret.push_back(c);
}
}
sort(ret.begin(), ret.end());
return ret;
}
};
第二题
class Solution {
public:
double get(int x1, int y2, int x, int y) {
double dx = x1 - x;
double dy = y2 - y;
return sqrt(dx * dx + dy * dy);
}
int countLatticePoints(vector<vector<int>>& cs) {
int ret = 0;
for (int i = 0; i <= 205; ++ i) {
for (int j = 0; j <= 206; ++ j) {
for (auto& it : cs) {
if (get(i, j, it[0], it[1]) <= it[2]) {
++ ret;
// cout << i << " " << j << endl;
break;
}
}
}
}
return ret;
}
};
第三题
class Solution {
public:
static const int N = 1E5 + 100;
unordered_map<int, int> mp;
int pre[N][105];
vector<int> arr;
void add(int x1, int y1, int x2, int y2) {
pre[x1][y1] ++;
pre[x2 + 1][y1] --;
pre[x1][y2 + 1] --;
pre[x2 + 1][y2 + 1] ++;
}
vector<int> ret;
vector<int> countRectangles(vector<vector<int>>& rs, vector<vector<int>>& ps) {
for (auto& it : rs) {
arr.push_back(it[0]);
}
for (auto& it : ps) {
arr.push_back(it[0]);
}
sort(arr.begin(), arr.end());
arr.erase(unique(arr.begin(), arr.end()), arr.end());
for (int i = 0; i < arr.size(); ++ i) {
mp[arr[i]] = i + 1;
}
for (auto& it : rs) {
int x = mp[it[0]];
int y = it[1];
add(1, 1, x, y);
}
for (int i = 1; i < arr.size() + 1; ++ i) {
for (int j = 1; j < 105; ++ j) {
pre[i][j] = pre[i][j] + pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1];
}
}
ret.assign(ps.size(), 0);
for (int i = 0; i < ps.size(); ++ i) {
int x = mp[ps[i][0]];
int y = ps[i][1];
ret[i] = pre[x][y];
}
return ret;
}
};
第四题
#define LL long long
class Solution {
public:
static const int N = 2e5 + 5;
int d[N], pre[N];
vector<int> ret;
vector<int> arr;
unordered_map<int, int> mp;
vector<int> fullBloomFlowers(vector<vector<int>>& fs, vector<int>& ps) {
ret.assign(ps.size(), 0);
for (auto& it : fs) {
arr.push_back(it[0]);
arr.push_back(it[1]);
}
for (auto& it : ps) {
arr.push_back(it);
}
sort(arr.begin(), arr.end());
arr.erase(unique(arr.begin(), arr.end()), arr.end());
// for (int i : arr) cout << i << " ";
// cout << endl;
for (int i = 0; i < arr.size(); ++ i) {
mp[arr[i]] = i;
}
for (auto& it : fs) {
// int x1 = find(arr.begin(), arr.end(), it[0]) - arr.begin();
// int x2 = find(arr.begin(), arr.end(), it[1]) - arr.begin();
// cout << x1 << " " << x2 << endl;
int x1 = mp[it[0]];
int x2 = mp[it[1]];
d[x1] += 1;
d[x2 + 1] -= 1;
}
pre[0] = d[0];
for (int i = 1; i < N; ++ i) {
pre[i] += pre[i - 1] + d[i];
}
// for (int i : pre) {
// cout << i << " ";
// }
// cout << endl;
for (int i = 0; i < ps.size(); ++ i) {
// int x = find(arr.begin(), arr.end(), ps[i]) - arr.begin();
int x = mp[ps[i]];
// cout << x << endl;
ret[i] = pre[x];
}
return ret;
}
};
252 场周赛
第一题
class Solution {
public:
bool isThree(int n) {
int c = 0;
for (int i = 1; i <= n; ++i) {
if (n % i == 0) ++ c;
}
return c == 3;
}
};
第二题
class Solution {
public:
long long numberOfWeeks(vector<int>& milestones) {
// 耗时最长工作所需周数
long long longest = *max_element(milestones.begin(), milestones.end());
// 其余工作共计所需周数
long long rest = accumulate(milestones.begin(), milestones.end(), 0LL) - longest;
if (longest > rest + 1){
// 此时无法完成所耗时最长的工作
return rest * 2 + 1;
}
else {
// 此时可以完成所有工作
return longest + rest;
}
}
};
第三题
#define ll long long
class Solution {
public:
long long minimumPerimeter(long long ns) {
int n = 1;
while (ns > (ll)n * n * 12) {
ns -= (ll)n * n * 12;
++ n;
}
return n * 8;
}
};
第四题
class Solution {
public:
int countSpecialSubsequences(vector<int>& nums) {
long long f0 = 0, f1 = 0, f2 = 0;
int mod = 1e9 + 7;
for (int& i : nums) {
if (i == 0) {
f0 += f0 + 1;
f0 %= mod;
}else if (i == 1) {
f1 += f1 + f0;
f1 %= mod;
}
else if (i == 2) {
f2 += f1 + f2;
f2 %= mod;
}
}
return f2;
}
};
136 场周赛
第一题
class Solution {
public:
int dx[4] = {0, -1, 0, 1};
int dy[4] = {1, 0, -1, 0};
bool isRobotBounded(string is) {
int x = 0, y = 0;
int dic = 0;
for (int k = 0; k < 4; ++ k) {
for (int i = 0; i < is.size(); ++ i) {
if (is[i] == 'L') {
++ dic;
if (dic == 4) {
dic = 0;
}
}else if (is[i] == 'R') {
if (dic == 0) {
dic = 3;
}
else -- dic;
}
else {
x += dx[dic];
y += dy[dic];
}
}
}
// cout << x << endl;
return x == 0 && y == 0;
}
};
第二题
class Solution {
public:
static const int N = 1E5 + 5;
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
unordered_set<int> st;
vector<int> ret;
vector<vector<int> > near;
void dfs(int u) {
int t = 1;
while (count(near[u].begin(), near[u].end(), t)) ++ t;
ret[u - 1] = t;
st.insert(u);
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
near[j].push_back(t);
}
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (!st.count(j)) {
dfs(j);
}
}
}
vector<int> gardenNoAdj(int n, vector<vector<int>>& ps) {
ret.assign(n, 0);
near.assign(n + 1, vector<int>());
memset(h, - 1, sizeof h);
for (auto& it : ps) {
add(it[0], it[1]);
add(it[1], it[0]);
}
for (int i = 1; i <= n; ++ i) {
if (!st.count(i)) {
dfs(i);
}
}
return ret;
}
};
第三题
class Solution {
public:
int maxSumAfterPartitioning(vector<int>& arr, int k) {
int n = arr.size();
vector<int> dp(n);
for (int i = 0; i < n; ++ i) {
dp[i] = arr[i];
if (i) {
dp[i] += dp[i - 1];
}
int cur = arr[i];
for (int j = 1; j < k && j <= i; ++ j) {
cur = max(cur, arr[i - j]);
if (i == j)
dp[i] = max(dp[i], cur * (j + 1));
else dp[i] = max(dp[i], cur * (j + 1) + dp[i - j - 1]);
}
}
return dp[n - 1];
}
};
第四题
#define ULL unsigned long long
class Solution {
public:
static const int N = 1E5 + 10;
const int sp = 131;
ULL h[N], p[N];
ULL get(int l, int r) {
return h[r] - h[l - 1] * p[r - l + 1];
}
bool check(int len, string& ret, string& s) {
unordered_map<ULL, int> mp;
for (int i = 0; i + len - 1 < s.size(); ++ i) {
ULL x = get(i + 1, i + len);
mp[x] ++;
if (mp[x] >= 2) {
if (len > ret.size())
ret = s.substr(i, len);
return true;
}
}
return false;
}
string longestDupSubstring(string s) {
int n = s.size();
p[0] = 1;
for (int i = 1; i <= n; ++ i) {
h[i] = h[i - 1] * sp + s[i - 1];
p[i] = p[i - 1] * sp;
}
string ret;
int l = 1, r = s.size();
while (l < r) {
int mid = l + r >> 1;
if (check(mid, ret, s)) {
l = mid + 1;
}else {
r = mid;
}
}
return ret;
}
};
164 场周赛
第一题
class Solution {
public:
int minTimeToVisitAllPoints(vector<vector<int>>& ps) {
int ret = 0;
for (int i = 1; i < ps.size(); ++ i) {
int a = ps[i - 1][0], b = ps[i - 1][1];
int c = ps[i][0], d = ps[i][1];
int x = min(abs(c - a), abs(d - b));
ret += x;
if (c < a) c += x;
else a += x;
if (b < d) b += x;
else d += x;
ret += abs(c - a) + abs(d - b);
}
return ret;
}
};
第二题
class Solution {
public:
int countServers(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
vector<int> row(n);
vector<int> col(m);
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (grid[i][j]) ++ row[i];
}
}
for (int j = 0; j < m; ++ j) {
for (int i = 0; i < n; ++ i) {
if (grid[i][j]) ++ col[j];
}
}
int ret = 0;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (grid[i][j])
if (row[i] >= 2 || col[j] >= 2) ++ ret;
}
}
return ret;
}
};
第三题
class Solution {
public:
static const int N = 1e5 + 10;
int son[N][26], idx = 0;
int cnt[N];
void insert(string s) {
int p = 0;
for (int i = 0; i < s.size(); ++ i) {
int u = s[i] - 'a';
if (!son[p][u] ) son[p][u] = ++ idx;
p = son[p][u];
}
cnt[p] ++;
}
void dfs(vector<string>& ret, int p, string& t) {
for (int j = 0; j < cnt[p]; ++ j) {
if (ret.size() >= 3) return;
ret.push_back(t);
}
for (int i = 0; i < 26; ++ i) {
if (son[p][i]) {
char a = 'a' + i;
t += a;
dfs(ret, son[p][i], t);
t.pop_back();
}
if (ret.size() >= 3) return;
}
}
vector<vector<string>> suggestedProducts(vector<string>& ps, string sd) {
for (string s : ps) {
insert(s);
}
vector<vector<string>> ret(sd.size());
string t;
int p = 0;
for (int i = 0; i < sd.size(); ++ i) {
int u = sd[i] - 'a';
if (!son[p][u]) {
break;
}
t += sd[i];
p = son[p][u];
dfs(ret[i], p, t);
}
return ret;
}
};
第四题
class Solution {
public:
const int p = 1e9 + 7;
int f[1000005];
int numWays(int st, int an) {
f[0] = 1;
for (int i = 1; i <= st; ++ i) {
int last;
for (int j = 0; j < an; ++ j) {
if (j == 0) {
last = f[j];
f[j] = ((long long)f[j] + f[j + 1]) % p;
continue;
}
else if (j == an - 1) {
f[j] = ((long long)last + f[j]) % p;
continue;
}
int t = f[j];
f[j] = ((long long)f[j] + last + f[j + 1]) % p;
last = t;
if (f[j] == 0) break;
}
}
return f[0];
}
};
210 场周赛
第一题
class Solution {
public:
int maxDepth(string s) {
int ret = 0;
int cnt = 0;
for (int i = 0; i < s.size(); ++ i) {
if (s[i] == '(') {
++ cnt;
ret = max(ret, cnt);
}else if (s[i] == ')') -- cnt;
}
return ret;
}
};
第二题
class Solution {
public:
int maximalNetworkRank(int n, vector<vector<int>>& roads) {
vector<unordered_set<int>> g(n);
for (auto& it : roads) {
g[it[0]].insert(it[1]);
g[it[1]].insert(it[0]);
}
int ret = 0;
for (int i = 0; i < n; ++ i) {
for (int j = i + 1; j < n; ++ j) {
int t = g[i].size() + g[j].size();
if (g[i].count(j)) -- t;
ret = max(ret, t);
}
}
return ret;
}
};
第三题
class Solution {
public:
bool is_hui(string s) {
for (int i = 0, j = s.size() - 1; i < j; ++ i, -- j) {
if (s[i] != s[j]) return false;
}
return true;
}
bool check(string s, string t) {
int l, r;
if (s.size() % 2) {
l = s.size() / 2 - 1;
r = s.size() / 2 + 1;
}else {
l = s.size() / 2 - 1;
r = s.size() / 2;
}
while (l >= 0 && r < s.size() && s[l] == s[r]) --l, ++ r;
if (l == 0) return true;
return is_hui(s.substr(0, l + 1) + t.substr(r, t.size() - r)) || is_hui(t.substr(0, l + 1) + s.substr(r, s.size() - r));
}
bool checkPalindromeFormation(string a, string b) {
if (a.size() == 1 || b.size() == 1) return true;
return check(a, b) || check(b, a);
}
};
第四题
class Solution {
public:
vector<int> countSubgraphsForEachDiameter(int n, vector<vector<int>>& edges) {
vector<int> dp(1 << n);
vector<vector<int> > dist(n, vector<int>(n, 1e8));
for (auto& it : edges) {
dist[it[0] - 1][it[1] - 1] = 1;
dist[it[1] - 1][it[0] - 1] = 1;
dp[(1 << (it[0] - 1) ) + (1 << (it[1] - 1))] = 1;
}
for (int i = 0; i < n; ++ i) {
dist[i][i] = 0;
}
for (int k = 0; k < n; ++ k) {
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
for (int j = 1; j < dp.size(); ++ j) {
if (dp[j] == 0) continue;
for (int i = 0; i < n; ++ i) {
if ((j >> i & 1) || dp[j + (1 << i)]) continue;
for (int k = 0; k < n; ++ k) {
if ((j >> k & 1) && dist[i][k] == 1) {
// dp[j + (1 << i)] = 1;
dp[j + (1 << i)] = dp[j];
break;
}
}
if (!dp[j + (1 << i)]) continue;
for (int k = 0; k < n; ++ k) {
if (j >> k & 1) {
dp[j + (1 << i)] = max(dp[j + (1 << i)], dist[i][k]);
}
}
// int t = j + (1 << i);
// for (int k = 0; k < n; ++ k) {
// for (int u = 0; u < n; ++ u) {
// if ((t >> k & 1) && (t >> u & 1) )
// dp[j + (1 << i)] = max(dp[j + (1 << i)], dist[k][u]);
// }
// }
}
}
vector<int> ret(n - 1);
for (int j = 0; j < dp.size(); ++ j) {
if (dp[j])
{
ret[dp[j] - 1] ++;
}
}
return ret;
}
};
289 场周赛
第一题
class Solution {
public:
string digitSum(string s, int k) {
int cnt = 10;
while (s.size() > k) {
string t;
for (int i = 0; i < s.size(); i += k) {
string tt = s.substr(i, min(k, (int)s.size() - i));
int x = 0;
for (char& c : tt) {
x += c - '0';
}
t += to_string(x);
}
s = t;
}
return s;
}
};
第二题
class Solution {
public:
unordered_map<int, int> mp;
int minimumRounds(vector<int>& tasks) {
for (int& i : tasks) mp[i] ++;
int ret = 0;
for (auto& [c, v] : mp) {
if (v == 1) return -1;
ret += (v + 2) / 3;
}
return ret;
}
};
第三题
class Solution {
public:
int maxTrailingZeros(vector<vector<int>>& grid) {
int ret = 0;
int n = grid.size();
int m = grid[0].size();
vector<vector<pair<int, int> > > row(n + 1, vector<pair<int, int>>(m + 1));
vector<vector<pair<int, int>>> col(n + 1, vector<pair<int, int>> (m + 1));
for (int i = 1; i <= n; ++ i) {
int cnt2 = 0, cnt5 = 0;
for (int j = 1; j <= m; ++ j) {
int x = grid[i - 1][j - 1];
while (x % 2 == 0) {
++ cnt2;
x /= 2;
}
while (x % 5 == 0) {
++ cnt5;
x /= 5;
}
row[i][j] = {cnt2, cnt5};
// cout << i << " " << j << " " << row[i][j].first << " " << row[i][j].second << endl;
}
}
for (int j = 1; j <= m; ++ j) {
int cnt2 = 0, cnt5 = 0;
for (int i = 1; i <= n; ++ i) {
int x = grid[i - 1][j - 1];
while (x % 2 == 0) {
++ cnt2;
x /= 2;
}
while (x % 5 == 0) {
++ cnt5;
x /= 5;
}
col[i][j] = {cnt2, cnt5};
}
}
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= m; ++ j) {
ret = max(ret, min(row[i][j].first + col[i - 1][j].first,
row[i][j].second + col[i - 1][j].second));
ret = max(ret, min(row[i][m].first - row[i][j - 1].first + col[i - 1][j].first,
row[i][m].second - row[i][j - 1].second + col[i - 1][j].second));
ret = max(ret, min(row[i][j].first + col[n][j].first - col[i][j].first,
row[i][j].second + col[n][j].second - col[i][j].second));
ret = max(ret, min(row[i][m].first - row[i][j - 1].first + col[n][j].first - col[i][j].first,
row[i][m].second - row[i][j - 1].second + col[n][j].second - col[i][j].second));
}
}
return ret;
}
};
第四题
class Solution {
public:
static const int N = 1E5 + 5;
int h[N], e[N], ne[N], idx;
string s;
int ret = 0;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
int dfs(int u) {
int cnt = 1;
int t1 = 0, t2 = 0;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
int x = dfs(j);
if (s[j] != s[u]) {
if (x > t1) {
t2 = t1;
t1 = x;
}else if (x > t2) {
t2 = x;
}
}
}
cnt += t1;
ret = max(ret, max(cnt, cnt + t2));
return cnt;
}
int longestPath(vector<int>& pt, string s) {
this->s = s;
memset(h, -1, sizeof h);
for (int i = 1; i < pt.size(); ++ i) {
add(pt[i], i);
}
dfs(0);
return ret;
}
};
76 场双周
第一题
class Solution {
public:
int findClosestNumber(vector<int>& nums) {
int mx = 1e5;
int ret = -1e5;
for (int i : nums) {
int t = abs(i - 0);
if (t <= mx) {
if (t == mx)
ret = max(ret, i);
else ret = i;
mx = t;
}
}
return ret;
}
};
第二题
class Solution {
public:
long long waysToBuyPensPencils(int tl, int c1, int c2) {
long long ret = 0;
for (int i = 0; ; ++ i) {
long long t = tl - c1 * i;
if (t < 0) break;
int l = 0, r = 1e6 + 1;
while (l < r) {
int mid = l + r >> 1;
if ((long long)mid * c2 < t) {
l = mid + 1;
}else r = mid;
}
if ((long long) l * c2 > t) -- l;
ret += l + 1;
// cout << l << endl;
}
return ret;
}
};
第三题
class ATM {
public:
long long cnt[5];
int mp[5] = {20, 50, 100, 200, 500};
ATM() {
memset(cnt, 0, sizeof cnt);
}
void deposit(vector<int> bt) {
int j = 0;
for (int i : bt) {
cnt[j ++] += i;
}
}
vector<int> withdraw(int at) {
int i = 4;
vector<int> ret(5);
while (at > 0 && i >= 0) {
if (at >= mp[i]) {
long long l = 0, r = cnt[i];
while (l <= r) {
long long mid = l + r >> 1;
if (at - (long long) mid * mp[i] < 0) {
r = mid - 1;
}else l = mid + 1;
}
-- l;
// cout << mp[i] << " " << l << " " << at << " " << cnt[i] << endl;
at -= min(l, cnt[i]) * mp[i];
ret[i] = min(l, cnt[i]);
}
-- i;
}
if (at == 0) {
for (int j = 0; j < ret.size(); ++ j) {
cnt[j] -= ret[j];
}
return ret;
}else return {-1};
}
};
/**
* Your ATM object will be instantiated and called as such:
* ATM* obj = new ATM();
* obj->deposit(banknotesCount);
* vector<int> param_2 = obj->withdraw(amount);
*/
第四题
class Solution {
public:
int maximumScore(vector<int>& scores, vector<vector<int>>& edges) {
int n = scores.size();
vector<vector<pair<int, int> > > g(n);
for (auto& it : edges) {
int a = it[0], b = it[1];
g[a].push_back({scores[b], b});
g[b].push_back({scores[a], a});
}
for (int i = 0; i < n; ++ i) {
sort(g[i].begin(), g[i].end(), [](pair<int, int>& a, pair<int, int>& b) {
return a.first > b.first;
});
}
int ret = -1;
for (auto& it : edges) {
int a = it[0], b = it[1];
for (int i = 0; i < min(3, (int)g[a].size()); ++ i) {
for (int j = 0; j < min(3, (int)g[b].size()); ++ j) {
if (g[a][i].second != b && g[a][i].second != g[b][j].second && g[b][j].second != a) {
ret = max(ret, g[a][i].first + scores[a] + scores[b] + g[b][j].first);
}
}
}
}
return ret;
}
};
127 场单周
第一题
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int i = 0;
int ret = 0;
while (i < nums.size() && nums[i] < 0 && k > 0) {
-- k;
nums[i] = abs(nums[i]);
++ i;
}
k %= 2;
sort(nums.begin(), nums.end());
i = 0;
while (i < nums.size()) {
if (k > 0) {
-- k;
ret -= nums[i];
}else ret += nums[i];
++ i;
}
return ret;
}
};
第二题
class Solution {
public:
int clumsy(int n) {
int k = 0;
string opp = "*/+-";
stack<char> op;
stack<int> num;
num.push(n);
while (-- n) {
int t = n;
char c = opp[k ++];
k %= 4;
if (c == '*') {
num.top() *= t;
}else if (c == '/') {
num.top() /= t;
}else if (c == '+' || c == '-') {
num.push(t);
op.push(c);
}
}
int t1 = 0, t2 = 0;
while (op.size()) {
int t = num.top();
num.pop();
char c = op.top();
op.pop();
if (c == '+') {
t1 += t;
}else {
t2 -= t;
}
}
return num.top() + t1 + t2;
}
};
第三题
class Solution {
public:
int minDominoRotations(vector<int>& tops, vector<int>& bottoms) {
pair<int, int> mx = {0, 0};
for (int i = 1; i <= 6; ++ i) {
int k = 0;
for (int j = 0; j < tops.size(); ++ j) {
if (tops[j] == i || bottoms[j] == i) {
++ k;
}
}
if (k > mx.first) {
mx = {k, i};
}
}
if (mx.first != tops.size()) return -1;
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < tops.size(); ++ i) {
if (tops[i] == mx.second) ++ cnt1;
if (bottoms[i] == mx.second) ++ cnt2;
}
return mx.first - max(cnt1, cnt2);
}
};
第四题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> p;
TreeNode* dfs(int& u, int mx) {
TreeNode* head = new TreeNode(p[u]);
int x = p[u];
if (u + 1 < p.size() && p[u + 1] < x) {
head->left = dfs(++ u, x);
}
// if (x == 8) cout << u << endl;
if (u + 1 < p.size() && p[u + 1] > x && p[u + 1] < mx) {
head->right = dfs(++ u, mx);
}
return head;
}
TreeNode* bstFromPreorder(vector<int>& preorder) {
this->p = preorder;
int u = 0;
return dfs(u, 1e8);
}
};
37 场双周
第一题
class Solution {
public:
double trimMean(vector<int>& arr) {
sort(arr.begin(), arr.end());
int idx = arr.size() * 5 / 100;
double sum = 0;
for (int i = idx; i < arr.size() - idx; ++ i) {
sum += arr[i];
}
return sum / (arr.size() - 2 * idx);
}
};
第二题
class Solution {
public:
double get(pair<int, int> a, pair<int, int> b) {
double dx = a.first - b.first;
double dy = a.second - b.second;
return sqrt(dx * dx + dy * dy);
}
vector<int> bestCoordinate(vector<vector<int>>& ts, int rs) {
vector<int> ret = {0, 0, 0};
for (int i = 0; i <= 100; ++ i) {
for (int j = 0; j <= 100; ++ j) {
int mx = 0;
for (auto& it : ts) {
double dist = get({i, j}, {it[0], it[1]});
if (dist <= rs) {
mx += (it[2] / (1 + dist));
}
}
// if (i == 0 && j == 1) cout << mx << endl;
// if (i == 1 && j == 1) cout << mx << endl;
if (mx >= ret[2]) {
if (i < ret[0] || (i == ret[0] && j < ret[1]) || mx > ret[2]) {
ret = {i, j, mx};
}
}
}
}
return {ret[0], ret[1]};
}
};
第三题
class Solution {
static const int p = 1e9 + 7;
long long f[1001][1001][2];
public:
int numberOfSets(int n, int k) {
memset(f, 0, sizeof f);
f[0][0][0] = 1;
for (int i = 1; i < n; ++ i) {
f[i][0][0] = 1;
for (int j = 1; j <= k; ++ j) {
f[i][j][0] = f[i - 1][j][1] + f[i - 1][j][0];
f[i][j][0] %= p;
f[i][j][1] = f[i - 1][j - 1][0] + f[i - 1][j - 1][1] + f[i - 1][j][1];
f[i][j][1] %= p;
}
}
return (f[n - 1][k][0] + f[n - 1][k][1]) % p;
}
};
第四题
#define p 1000000007;
#define LL long long
class Fancy {
public:
static const int N = 1E5 + 5;
struct node {
int l, r;
int sum, add, mul;
}tr[N * 8];
int tot = 0;
int w[N];
void pushup(int u) {
tr[u].sum = (tr[u << 1].sum + tr[u << 1 | 1].sum) % p;
}
void pushup(node& u, node& l, node& r) {
u.sum = ((LL)l.sum + r.sum) % p;
}
void pushdown(int u, int add, int mul) {
tr[u].sum = ((LL)tr[u].sum * mul + (LL)(tr[u].r - tr[u].l + 1) * add) % p;
tr[u].add = ((LL)tr[u].add * mul + add) % p;
tr[u].mul = ((LL)tr[u].mul * mul) % p;
}
void pushdown(int u) {
pushdown(u << 1, tr[u].add, tr[u].mul);
pushdown(u << 1 | 1, tr[u].add, tr[u].mul);
tr[u].add = 0;
tr[u].mul = 1;
}
void modify(int u, int l, int r, int add, int mul) {
if (tr[u].l >= l && tr[u].r <= r) {
// tr[u].sum = (long long) (tr[u].sum * mul) % p;
// tr[u].sum = (long long)(tr[u].sum + (tr[u].r - tr[u].l + 1) * add) & p;
tr[u].sum = ((LL)tr[u].sum * mul + (LL)(tr[u].r - tr[u].l + 1) * add) % p;
// cout << "->" << mul << endl;
tr[u].add = ((LL)tr[u].add * mul + add) % p;
tr[u].mul = ((LL) tr[u].mul * mul ) % p;
}
else {
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) modify(u << 1, l, r, add, mul);
if (r > mid) modify(u << 1 | 1, l, r, add, mul);
pushup(u);
}
}
node query(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) {
return tr[u];
}
else {
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if (r <= mid) return query(u << 1, l, r);
else if (l > mid) return query(u << 1 | 1, l, r);
node left = query(u << 1, l, r);
node right = query(u << 1 | 1, l, r);
node ret;
pushup(ret, left, right);
return ret;
}
}
void built(int u, int l, int r) {
if (l == r) {
tr[u] = {l, r, w[l], 0, 1};
}
else {
tr[u] = {l, r, 0, 0, 1};
int mid = l + r >> 1;
built(u << 1, l, mid);
built(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
Fancy() {
built(1, 1, N - 3);
}
void append(int val) {
++ tot;
modify(1, tot, tot, val, 1);
}
void addAll(int inc) {
modify(1, 1, tot, inc, 1);
}
void multAll(int m) {
modify(1, 1, tot, 0, m);
}
int getIndex(int idx) {
int x = query(1, idx + 1, idx + 1).sum;
return x == 0 ? -1 : x;
}
};
/**
* Your Fancy object will be instantiated and called as such:
* Fancy* obj = new Fancy();
* obj->append(val);
* obj->addAll(inc);
* obj->multAll(m);
* int param_4 = obj->getIndex(idx);
*/
招商银行专场
第一题
class Solution {
public:
string deleteText(string a, int index) {
string ret;
for (int i = 0; i < a.size(); ++ i) {
int j = i;
string t;
while (j < a.size() && a[j] != ' ') t += a[j ++];
if (index > j) {
ret += t;
ret += " ";
}
else {
if (index == j) {
ret += t;
ret += " ";
}
index = a.size() + 1;
}
i = j;
}
if (ret.size())
ret.pop_back();
return ret;
}
};
第二题
class Solution {
public:
static const int N = 2E5 + 5;
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
int ret = 1;
vector<vector<int> > near;
void dfs(int u, int f) {
int t = 1;
while (count(near[u].begin(), near[u].end(), t) || (f != -1 && count(near[f].begin(), near[f].end(), t)) ) ++ t;
ret = max(ret, t);
if (f != -1) near[f].push_back(t);
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
near[j].push_back(t);
dfs(j, u);
}
}
int numFlowers(vector<vector<int>>& rs) {
near.assign(N, vector<int>());
memset(h, -1, sizeof h);
for (auto& it : rs) {
add(it[0], it[1]);
add(it[1], it[0]);
}
dfs(0, -1);
// for (int i = 0; i <= 3; ++ i) {
// for (int j : near[i]) cout << j << " ";
// cout << endl;
// }
return ret;
}
};
第三题
class Solution {
public:
static const int N = 1E4 + 5;
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
unordered_set<int> dian;
vector<int> lightSticks(int ht, int w, vector<int>& is) {
sort(is.begin(), is.end());
int k = -1;
memset(h, -1, sizeof h);
for (int i = 0; i < ht; ++ i) {
for (int j = 0; j < w; ++ j) {
int a = i * (w + 1) + j;
int b = a + 1;
++ k;
if (count(is.begin(), is.end(), k)) {
continue;
}
// cout << a << " " << b << endl;
add(a, b);
add(b, a);
dian.insert(a);
dian.insert(b);
}
for (int j = 0; j <= w; ++ j) {
int a = i * (w + 1) + j;
int b = a + (w + 1);
++ k;
if (count(is.begin(), is.end(), k)){
continue;
}
add(a, b);
add(b, a);
// cout << a << " " << b << endl;
dian.insert(a);
dian.insert(b);
}
}
for (int j = 0; j < w; ++ j) {
int a = ht * (w + 1) + j;
int b = a + 1;
++ k;
if (count(is.begin(), is.end(), k)) {
continue;
}
add(a, b);
add(b, a);
// cout << a << " " << b << endl;
dian.insert(a);
dian.insert(b);
}
vector<int> ret;
int tmax = 1e8;
for (int i : dian) {
unordered_set<int> st;
queue<int> q;
q.push(i);
int tm = 0;
st.insert(i);
while (q.size()) {
++ tm;
int sz = q.size();
for (int i = 0; i < sz; ++ i) {
int t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i]) {
int j = e[i];
if (st.count(j)) continue;
st.insert(j);
q.push(j);
}
}
}
if (st.size() == dian.size() && tm < tmax) {
tmax = tm;
ret = {i};
}
else if (st.size() == dian.size() && tm == tmax) {
ret.push_back(i);
}
}
sort(ret.begin(), ret.end());
return ret;
}
};
第四题
补题中...
288 场单周
第一题
class Solution {
public:
int largestInteger(int num) {
vector<int> ji, ou;
vector<int> d;
while (num) {
int x = num % 10;
num /= 10;
if (x % 2) ji.push_back(x);
else ou.push_back(x);
if (x % 2) {
d.push_back(1);
}else d.push_back(2);
}
sort(ji.begin(), ji.end());
sort(ou.begin(), ou.end());
// for (int i : ji) cout << i << " ";
// for (int i : ou) cout << i << " ";
int ret = 0;
for (int i = d.size() - 1; i >= 0; -- i) {
ret *= 10;
if (d[i] == 1) {
ret += ji.back();
ji.pop_back();
}else {
ret += ou.back();
ou.pop_back();
}
}
return ret;
}
};
第二题
class Solution {
public:
string minimizeResult(string en) {
int ix;
for (int i = 0; i < en.size(); ++ i) {
if (en[i] == '+') {
ix = i;
break;
}
}
int ret = 1e9 + 5;
int idxl, idxr;
for (int i = ix - 1; i >= 0; -- i) {
for (int j = ix + 1; j < en.size(); ++ j) {
int pre = 0, midl = 0, midr = 0, bk = 0;
for (int k = i; k < ix; ++ k) {
midl *= 10;
midl += (en[k] - '0');
}
for (int k = 0; k < i; ++ k) {
pre *= 10;
pre += (en[k] - '0');
}
for (int k = ix + 1; k <= j; ++ k) {
midr *= 10;
midr += (en[k] - '0');
}
for (int k = j + 1; k < en.size(); ++ k) {
bk *= 10;
bk += (en[k] - '0');
}
int t = midl + midr;
if (pre) t *= pre;
if (bk) t *= bk;
// cout << i << " " << j << " " << pre << " " << midl << " " << midr << " " << bk << " " << t << endl;
if (t < ret) {
ret = t;
idxl = i, idxr = j;
}
}
}
string tt;
for (int i = 0; i < en.size(); ++ i) {
if (i == idxl) {
tt += "(";
}
tt += en[i];
if (i == idxr) {
tt += ")";
}
}
return tt;
}
第三题
class Solution {
public:
int maximumProduct(vector<int>& nums, int k) {
long long ret = 1;
priority_queue<int, vector<int>, greater<int> > q;
for (int i : nums) {
q.push(i);
}
while (k) {
int t = q.top();
q.pop();
t += 1;
-- k;
q.push(t);
}
int mod = 1e9 + 7;
while (q.size()) {
ret *= q.top();
ret %= mod;
q.pop();
}
return ret;
}
};
第四题
class Solution {
public:
long long maximumBeauty(vector<int>& flowers, long long newFlowers, int target, int full, int partial) {
int n = flowers.size();
vector<int> a(n + 1);
sort(flowers.begin(), flowers.end());
vector<long long> f(n + 1);
for (int i = 1; i <= n; ++ i) {
a[i] = flowers[i - 1];
}
for (int i = 1; i <= n; ++ i) {
f[i] = f[i - 1] + a[i];
}
int st = 0;
for (; st < n; ++ st) {
if (a[n - st] < target) break;
}
long long ans = 0, sm = 0;
for (int i = st; i <= n && sm <= newFlowers; ++ i) {
int l = 0, r = n - i + 1;
while (l < r) {
int mid = l + r >> 1;
long long t = 1ll * mid * a[mid] - f[mid];
if (t + sm > newFlowers) r = mid;
else l = mid + 1;
}
-- l;
long long x = newFlowers - sm - (1ll * l * a[l] - f[l]);
long long y = min(l ? a[l] + x / l : 0, target - 1ll);
ans = max(ans, 1ll * i * full + y * partial);
sm += target - a[n - i];
}
return ans;
}
};
143 场单周
第一题
class Solution {
public:
vector<int> distributeCandies(int cs, int num) {
int tot = 0;
for (int i = 1; i <= num; ++ i) tot += i;
int l = 0, r = 1e9 + 1;
int d = num * num;
while (l < r) {
int mid = l + r >> 1;
long long k = (unsigned long long) mid * (tot + tot + (long long)(mid - 1) * d) / 2;
if (cs > k) {
l = mid + 1;
}
else r = mid;
}
-- l;
// cout << l << endl;
vector<int> ret(num);
for (int i = 0; i < num; ++ i) {
ret[i] = l * (i + 1 + i + 1 + (l - 1) * num) / 2;
// cout << ret[i] << " ";
cs -= ret[i];
}
// cout << endl;
int st = 1 + l * num;
// cout << st << endl;
for (int i = 0; i < num; ++ i) {
ret[i] += min(st, cs);
cs -= st;
++ st;
if (cs <= 0) break;
}
return ret;
}
};
第二题
class Solution {
public:
vector<int> pathInZigZagTree(int label) {
vector<int> ret;
int i = 1;
while (label >= i * 2) {
i *= 2;
}
i /= 2;
while (label >= 1) {
ret.push_back(label);
label /= 2;
label = i + (i * 2 - 1 - label);
i /= 2;
}
reverse(ret.begin(), ret.end());
return ret;
}
};
第三题
class Solution {
public:
int minHeightShelves(vector<vector<int>>& books, int shelfWidth) {
int n = books.size();
vector<int> dp(n + 1, 1e8);
dp[0] = 0;
for (int i = 1; i <= n; ++ i) {
int hm = 0, res = shelfWidth;
for (int j = i; j >= 1 && res >= books[j - 1][0]; -- j) {
hm = max(hm, books[j - 1][1]);
dp[i] = min(dp[i], dp[j - 1] + hm);
res -= books[j - 1][0];
}
}
return dp[n];
}
};
第四题
class Solution {
public:
char op(char a, char b, char c) {
char ret;
if (c == '&') {
if (a == 't' && b == 't') {
ret = 't';
}
else ret = 'f';
}else {
if (a == 't' || b == 't') {
ret = 't';
}else ret = 'f';
}
return ret;
}
bool parseBoolExpr(string en) {
stack<char> top;
stack<char> vl;
for (int i = 0; i < en.size(); ++ i) {
if (en[i] == ',') continue;
else if (en[i] == '|' || en[i] == '&' || en[i] == '!') {
top.push(en[i]);
}
else if (en[i] == '(') {
vl.push(en[i]);
}
else if (en[i] == ')') {
char c = vl.top();
vl.pop();
vl.pop();
if (top.top() == '!') {
if (c == 't') c = 'f';
else c = 't';
}
top.pop();
if (vl.size() && vl.top() != '(' && top.top() != '!') {
char c2 = vl.top();
vl.pop();
c = op(c, c2, top.top());
}
vl.push(c);
}
else {
if (top.top() != '!' && vl.top() != '(') {
char c1 = vl.top();
vl.pop();
char rt = op(c1, en[i], top.top());
vl.push(rt);
}
else vl.push(en[i]);
}
}
return vl.top() == 't';
}
};
25 场双周
第一题
class Solution {
public:
vector<bool> kidsWithCandies(vector<int>& cs, int es) {
vector<bool> ret;
int mx = 0;
for (int i : cs) {
mx = max(i, mx);
}
for (int i = 0; i < cs.size(); ++ i) {
if (cs[i] + es >= mx) ret.push_back(true);
else ret.push_back(false);
}
return ret;
}
};
第二题
class Solution {
public:
int maxDiff(int num) {
vector<int> d;
while (num) {
d.push_back(num % 10);
num /= 10;
}
if (d.size() == 1) return 8;
int dx = d.size() - 1;
while (d[dx] == 9) -- dx;
int tmax = 0;
for (int i = d.size() - 1; i >= 0; -- i) {
tmax *= 10;
if (d[i] == d[dx]) tmax += 9;
else tmax += d[i];
}
int tmin = 0;
dx = d.size() - 1;
if (d.back() == 1) {
-- dx;
while (dx > 0 && d[dx] <= 1) -- dx;
}
for (int i = d.size() - 1; i >= 0; -- i) {
tmin *= 10;
if (d[i] == d[dx] ) {
if (d[d.size() - 1] == d[dx]) tmin += 1;
else tmin += 0;
}
else tmin += d[i];
}
return tmax - tmin;
}
};
第三题
class Solution {
public:
bool checkIfCanBreak(string s1, string s2) {
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
int f1 = 1;
int f2 = 1;
for (int i = 0; i < s1.size(); ++ i) {
if (s1[i] > s2[i]) f1 = 0;
if (s2[i] > s1[i]) f2 = 0;
}
return f1 == 1 || f2 == 1;
}
};
第四题
class Solution {
public:
static const int N = 500;
static const int mod = 1e9 + 7;
int st[N];
int n;
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
long long ret = 0;
vector<vector<long long> > mp;
int dfs(int u, int cnt, int state) {
if (cnt == n) {
return 1;
}
if (mp[u][state]) return mp[u][state];
if (u > 40) return 0;
int k = state;
mp[u][k] += dfs(u + 1, cnt, state);
mp[u][k] %= mod;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (state >> j & 1) continue;
state |= (1 << j);
mp[u][k] += dfs(u + 1, cnt + 1, state);
mp[u][k] %= mod;
state -= (1 << j);
}
return mp[u][k];
}
int numberWays(vector<vector<int>>& hats) {
n = hats.size();
mp.assign(42, vector<long long>(1 << n));
memset(h, -1, sizeof h);
for (int i = 0; i < hats.size(); ++ i) {
for (int j = 0; j < hats[i].size(); ++ j) {
add(hats[i][j], i);
}
}
mp[0][0] = 1;
for (int i = 1; i <= 40; ++ i) {
mp[i][0] = mp[i - 1][0];
for (int state = 1; state < (1 << n); ++ state) {
mp[i][state] = mp[i - 1][state];
for (int j = h[i]; j != -1; j = ne[j]) {
int k = e[j];
if (state >> k & 1)
mp[i][state] += mp[i - 1][state - (1 << k)];
mp[i][state] %= mod;
}
}
}
return mp[40][(1 << n) - 1];
// return dfs(1, 0, 0);
}
};
264 场单周
第一题
class Solution {
public:
int countValidWords(string se) {
stringstream ss;
ss << se;
int ret = 0;
while (ss) {
string t;
ss >> t;
// cout << t << endl;
if (!t.size()) break;
int cnt = 0;
int f = 0;
for (int i = 0; i < t.size(); ++ i) {
if (t[i] == '-') {
if (i == 0) f = 1;
if (i + 1 < t.size()) {
if (t[i + 1] < 'a' || t[i] > 'z') f = 1;
}
++ cnt;
}
if (t[i] >= '0' && t[i] <= '9') f = 1;
if (i != t.size() - 1 && ((t[i] < 'a' || t[i] > 'z') && t[i] != '-')) f = 1;
}
// if (t == "pencil-sharpener.") cout << f << endl;
if (f) continue;
if (t.back() == '-' || cnt > 1 ) continue;
// cout << t << endl;
++ ret;
}
return ret;
}
};
第二题
class Solution {
public:
int nextBeautifulNumber(int n) {
for(int i = n + 1;; ++i) {
if(isBalanced(i)) return i;
}
return -1;
}
bool isBalanced(int num) {
int cnt[10] = {0}; // 用于计算0-9每个数字出现的次数
while(num) {
cnt[num % 10]++;
num /= 10;
}
for(int i = 0; i < 10; ++i) {// 当数字 i 出现且cnt[i] != i 不是平衡数
if(cnt[i] != 0 && cnt[i] != i) return false;
}
return true;
}
};
第三题
class Solution {
public:
static const int N = 1E5 + 5;
int h[N], e[N], ne[N], idx;
int sz[N];
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
int cnt = 0;
long long ret = 0;
void dfs(int u) {
sz[u] = 1;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
dfs(j);
sz[u] += sz[j];
}
}
void dfs2(int u) {
long long t = 1;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
t *= sz[j];
dfs2(j);
}
if (u != 0)
t *= sz[0] - sz[u];
if (t > ret) {
ret = t;
cnt = 0;
}
if (t == ret) {
++ cnt;
}
}
int countHighestScoreNodes(vector<int>& ps) {
memset(h, -1, sizeof h);
for (int i = 1; i < ps.size(); ++ i) {
add(ps[i], i);
}
dfs(0);
dfs2(0);
return cnt;
}
};
第四题
class Solution {
public:
static const int N = 1E5 + 5;
int h[N], e[N], ne[N], idx;
int d[N], backup[N];
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
pair<int, int> q[N];
int minimumTime(int n, vector<vector<int>>& rs, vector<int>& te) {
memset(h, -1, sizeof h);
for (auto& it : rs) {
add(it[0], it[1]);
d[it[1]] ++;
}
int l = 1, r = 1e9;
unordered_map<int, int> mp;
while (l < r) {
int mid = l + r >> 1;
int hh = 0, tt = -1;
memcpy(backup, d, sizeof d);
for (int i = 1; i <= n; ++ i) {
if (d[i] == 0) {
q[++ tt] = {0, i};
}
}
int f = 1;
while (hh <= tt) {
pair<int, int> t = q[hh ++];
int x = t.second;
int tm = t.first + te[x - 1];
if (tm > mid) {
f = 0;
break;
}
for (int i = h[x]; i != -1; i = ne[i]) {
int j = e[i];
mp[j] = max(mp[j], tm);
if (-- d[j] == 0) {
q[++ tt] = {mp[j], j};
}
}
}
if (f) r = mid;
else l = mid + 1;
memcpy(d, backup, sizeof backup);
}
// cout << mp[3] << endl;
return l;
}
};
179 场单周
第一题
class Solution {
public:
string generateTheString(int n) {
string ret;
if (n % 2) {
for (int i = 0; i < n; ++ i) {
ret += 'a';
}
}
else {
for (int i = 0; i < n - 1; ++ i) {
ret += 'a';
}
ret += 'b';
}
return ret;
}
};
第二题
class Solution {
public:
int numTimesAllBlue(vector<int>& fs) {
int r = 0;
int tot = 0;
int ret = 0;
for (int i = 0; i < fs.size(); ++ i) {
++ tot;
r = max(fs[i], r);
if (r == tot) ++ ret;
}
return ret;
}
};
第三题
class Solution {
public:
static const int N = 1E5 + 5;
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
vector<int> it;
int hd;
bool dfs(int u, int tm, int tg) {
if (tm > tg) return false;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (!dfs(j, tm + it[u], tg)) return false;
}
return true;
}
bool check(int x) {
return dfs(hd, 0, x);
}
int numOfMinutes(int n, int hd, vector<int>& mr, vector<int>& it) {
memset(h, -1, sizeof h);
this->it = it;
this->hd = hd;
for (int i = 0; i < mr.size(); ++ i) {
if (i != hd) {
add(mr[i], i);
}
}
int l = 0, r = 1e9 + 1;
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
};
第四题
class Solution {
public:
static const int N = 1E3;
int h[N], e[N], ne[N], idx;
int t, tg;
double sz[N];
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
bool dfs(int u, int f, vector<int>& track) {
track.push_back(u);
if (u == tg) {
return true;
}
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
if ( dfs(j, u, track) ) return true;
}
track.pop_back();
return false;
}
void dfs2(int u, int f) {
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
dfs2(j, u);
sz[u] ++;
}
}
double frogPosition(int n, vector<vector<int>>& edges, int t, int tg) {
this->t = t;
this->tg = tg;
memset(sz, 0, sizeof sz);
memset(h, -1, sizeof h);
for (auto& it : edges) {
add(it[0], it[1]);
add(it[1], it[0]);
}
vector<int> track;
dfs(1, -1, track);
dfs2(1, -1);
if (track.size() != t + 1) {
if (track.size() > t + 1) return 0;
else if (sz[tg] != 0) return 0;
}
double ret = 1;
for (int& i : track) {
// cout << i << " ";
if (i != tg) {
ret *= (double) 1 / sz[i];
}
}
// cout << endl;
return ret;
}
};
51 场双周
第一题
class Solution {
public:
string replaceDigits(string s) {
string ret;
for (int i = 0; i < s.size(); ++ i) {
if (i % 2) {
ret += char(ret.back() + (s[i] - '0'));
}
else ret += s[i];
}
return ret;
}
};
第二题
class SeatManager {
public:
priority_queue<int, vector<int>, greater<int>> q;
SeatManager(int n) {
for (int i = 1; i <= n; ++ i) q.push(i);
}
int reserve() {
int x = q.top();
q.pop();
return x;
}
void unreserve(int seatNumber) {
q.push(seatNumber);
}
};
/**
* Your SeatManager object will be instantiated and called as such:
* SeatManager* obj = new SeatManager(n);
* int param_1 = obj->reserve();
* obj->unreserve(seatNumber);
*/
第三题
class Solution {
public:
int maximumElementAfterDecrementingAndRearranging(vector<int>& arr) {
sort(arr.begin(), arr.end());
if (arr[0] != 1) {
arr[0] = 1;
}
for (int i = 1; i < arr.size(); ++ i) {
if (arr[i] - 1 > arr[i - 1]) {
arr[i] = arr[i - 1] + 1;
}
}
return arr[arr.size() - 1];
}
};
第四题
class Solution {
public:
static const int N = 1E7 + 5;
int tr[N];
int lowbit(int x) {
return x & -x;
}
void add(int x) {
for (int i = x; i < N; i += lowbit(i)) {
tr[i] += 1;
}
}
int query(int x) {
if (x < 0) return 0;
int ret = 0;
for (int i = x; i; i -= lowbit(i)) {
ret += tr[i];
}
return ret;
}
int query(int l, int r) {
return query(r) - query(l - 1);
}
vector<int> closestRoom(vector<vector<int>>& rs, vector<vector<int>>& qs) {
sort(rs.begin(), rs.end(), [](vector<int>& a, vector<int>& b){
return a[1] > b[1];
});
for (int i = 0; i < qs.size(); ++ i) {
qs[i].push_back(i);
}
sort(qs.begin(), qs.end(), [](vector<int>& a, vector<int>& b){
return a[1] > b[1];
});
int i = 0;
vector<int> ret(qs.size());
for (auto& it : qs) {
while (i < rs.size() && rs[i][1] >= it[1]) {
add(rs[i][0]);
++ i;
}
int f = 0;
int x = it[0];
int l = 0, r = x;
while (l < r) {
int mid = l + r >> 1;
if (query(x - mid, x)) r = mid;
else l = mid + 1;
}
int len = r == x ? N : l;
l = 0, r = N - x;
while (l < r) {
int mid = l + r >> 1;
if (query(x, x + mid)) r = mid;
else l = mid + 1;
}
if (r != N - x) {
if (l < len) {
len = l;
f = 1;
}
}
if (len == N) ret[it[2]] = -1;
else {
if (f) ret[it[2]] = x + len;
else ret[it[2]] = x - len;
}
}
return ret;
}
};
117 场单周
第一题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int x;
bool dfs(TreeNode* root) {
if (root->left && !dfs(root->left) ) return false;
if (root->right && !dfs(root->right)) return false;
return root->val == x;
}
bool isUnivalTree(TreeNode* root) {
x = root->val;
return dfs(root);
}
};
第二题
class Solution {
public:
vector<int> ret;
int n;
void dfs(int u, int last, int& k, int track) {
if (u == n) {
ret.push_back(track);
return;
}
if (last + k <= 9) {
int t = track;
track *= 10;
track += last + k;
dfs(u + 1, last + k, k, track);
track = t;
}
if (k != 0 && last - k >= 0) {
track *= 10;
track += last - k;
dfs(u + 1, last - k, k, track);
}
}
vector<int> numsSameConsecDiff(int n, int k) {
this->n = n;
for (int i = 1; i <= 9; ++ i) {
dfs(1, i, k, i);
}
return ret;
}
};
第三题
class Solution {
public:
unordered_map<string, vector<string> > mp;
vector<string> spellchecker(vector<string>& wt, vector<string>& qs) {
for (string& s : wt) {
string t = s;
transform(t.begin(), t.end(), t.begin(), ::tolower);
for (int i = 0; i < t.size(); ++ i) {
if (t[i] == 'a' || t[i] == 'e' || t[i] == 'i' || t[i] == 'o' || t[i] == 'u') {
t[i] = '?';
}
}
// cout << t << " " << s << endl;
mp[t].push_back(s);
}
// cout << endl;
vector<string> ret;
for (int i = 0; i < qs.size(); ++ i) {
string t = qs[i];
transform(t.begin(), t.end(), t.begin(), ::tolower);
for (int i = 0; i < t.size(); ++ i) {
if (t[i] == 'a' || t[i] == 'e' || t[i] == 'i' || t[i] == 'o' || t[i] == 'u') {
t[i] = '?';
}
}
string et = "";
string ult = "";
string yt = "";
// cout << t << " : ";
for (string& s : mp[t]) {
// if (qs[i] == "HARE")
// cout << s << " ";
int bs = 0;
int yuan = 0;
// if (qs[i] == "HARE") cout << endl;
for (int j = 0; j < (int)s.size(); ++ j) {
if (s[j] != qs[i][j]) {
char c = tolower(s[j]);
// ut << c << " " << s[j] << endl;
if (c == tolower(qs[i][j])) {
++ bs;
}else ++ yuan;
}
}
// if (qs[i] == "EkO") {
// cout << bs << " " << yuan << " " << endl;
// }
if (bs == 0 && yuan == 0) {
et = s;
break;
}
if (yuan) {
if (yt == "")
yt = s;
}
else if ( bs && ult == "") {
ult = s;
}
}
// if (qs[i] == "EkO"){
// cout << et << endl;
// cout << ult << endl;
// cout << yt << endl;
// }
if (et != "") {
ret.push_back(et);
}else if (ult != "") {
ret.push_back(ult);
}else ret.push_back(yt);
}
return ret;
}
};
第四题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int ret = 0;
int dfs(TreeNode* root) {
if (!root) {
return 2;
}
int l = dfs(root->left);
int r = dfs(root->right);
if (l == 0 || r == 0) {
++ ret;
return 1;
}
if (l == 1 || r == 1) return 2;
return 0;
}
int minCameraCover(TreeNode* root) {
int x = dfs(root);
if (x == 0) ++ ret;
return ret;
}
};
93 场单周
第一题
class Solution {
public:
int binaryGap(int n) {
int ret = 0;
int last = -1;
for (int i = 0; i < 32; ++ i) {
if (n & (1 << i)) {
if (last != - 1) {
ret = max(ret, i - last);
}
last = i;
}
}
return ret;
}
};
第二题
class Solution {
public:
int cnt[10];
bool reorderedPowerOf2(int n) {
int t = 0;
while (n) {
cnt[n % 10] ++;
n /= 10;
++ t;
}
for (int i = 0; i < 32; ++ i) {
int tt = pow(2, i);
int tc = 0;
int tcnt[10];
memset(tcnt, 0, sizeof tcnt);
while (tt) {
tcnt[tt % 10] ++;
tt /= 10;
++ tc;
}
if (tc < t) continue;
else if (tc > t) break;
int f = 1;
for (int i = 0; i < 10; ++ i) {
if (cnt[i] != tcnt[i] ){
f = 0;
break;
}
}
if (f) return true;
}
return false;
}
};
第三题
class Solution {
public:
unordered_map<int, vector<int> > mp;
int st[100005];
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
vector<int> tt = nums2;
vector<int> ret;
sort(nums2.begin(), nums2.end());
// cout << nums1[0] << " " << nums2[0] << endl;
int i = 0, j = 0;
for (i = 0, j = 0; i < nums2.size(); ++ i) {
while (j < nums1.size() && nums1[j] <= nums2[i]) ++ j;
if (j >= nums1.size()) break;
mp[nums2[i]].push_back(nums1[j]);
st[j ++] = 1;
}
j = 0;
while (i < nums2.size()) {
while (st[j]) ++ j;
mp[nums2[i]].push_back(nums1[j ++]);
++ i;
}
// cout << mp[11][0] << endl;
for (int& x : tt) {
ret.push_back(mp[x][0]);
mp[x].erase(mp[x].begin());
}
return ret;
}
};
第四题
class Solution {
public:
int minRefuelStops(int tg, int sl, vector<vector<int>>& ss) {
priority_queue<int, vector<int>, less<int>> q;
int ret = 0;
int r = sl;
for (auto& it : ss) {
while (r < it[0] && q.size()) {
r += q.top();
q.pop();
++ ret;
}
if (r >= it[0]) {
q.push(it[1]);
}else break;
if (r >= tg) break;
}
while (r < tg && q.size()) {
r += q.top();
q.pop();
++ ret;
}
return r >= tg ? ret : -1;
}
};
287 场单周
第一题
class Solution {
public:
int convertTime(string ct, string cot) {
int t1 = 0, t2 = 0;
t1 = ((ct[0] - '0') * 10 + (ct[1] - '0') ) * 60 + ((ct[3] - '0') * 10 + ct[4] - '0');
t2 = ((cot[0] - '0') * 10 + (cot[1] - '0') ) * 60 + ((cot[3] - '0') * 10 + cot[4] - '0');
t2 -= t1;
if (t2 < 0) t2 += 1440;
// cout << t1 << " " << t2 << endl;
int ret = 0;
while (t2) {
while (t2 >= 60) {
t2 -= 60;
++ ret;
}
while (t2 >= 15) {
t2 -= 15;
++ ret;
}
while (t2 >= 5) {
t2 -= 5;
++ ret;
}
while (t2 >= 1) {
t2 -= 1;
++ ret;
}
}
return ret;
}
};
第二题
class Solution {
public:
int cnt[100005];
vector<vector<int>> findWinners(vector<vector<int>>& ms) {
vector<int> st;
for (auto& it : ms) {
cnt[it[1]] ++;
st.push_back(it[0]);
st.push_back(it[1]);
}
vector<int> ret1, ret2;
for (int& i : st) {
if (cnt[i] == 0) {
ret1.push_back(i);
}
else if (cnt[i] == 1) {
ret2.push_back(i);
}
}
sort(ret1.begin(), ret1.end());
sort(ret2.begin(), ret2.end());
ret1.erase(unique(ret1.begin(), ret1.end()), ret1.end());
ret2.erase(unique(ret2.begin(), ret2.end()), ret2.end());
return {ret1, ret2};
}
};
第三题
class Solution {
public:
bool check(vector<int>& cs, int mid, long long k) {
long long cnt = 0;
for (int& i : cs) {
cnt += i / mid;
}
return cnt >= k;
}
int maximumCandies(vector<int>& cs, long long k) {
int l = 1, r = 1e7 + 1;
while (l < r) {
int mid = l + r >> 1;
if (check(cs, mid, k)) {
l = mid + 1;
}else {
r = mid;
}
}
return l - 1;
}
};
第四题
class Encrypter {
public:
vector<char> keys;
vector<string> vs;
vector<string> dy;
Encrypter(vector<char>& keys, vector<string>& vs, vector<string>& dy) {
this->keys = keys;
this->vs = vs;
this->dy = dy;
}
string encrypt(string word1) {
string ret;
for (int i = 0; i < word1.size(); ++ i) {
for (int j = 0; j < keys.size(); ++ j) {
if (word1[i] == keys[j]) {
ret += vs[j];
break;
}
}
}
return ret;
}
int decrypt(string word2) {
vector<vector<char> > tot(word2.size() / 2);
for (int i = 0; i < word2.size(); i += 2) {
string t = word2.substr(i, 2);
for (int j = 0; j < vs.size(); ++ j ) {
if (t == vs[j]) {
tot[i / 2].push_back(keys[j]);
}
}
sort(tot[i / 2].begin(), tot[i / 2].end());
tot[i / 2].erase(unique(tot[i / 2].begin(), tot[i / 2].end()), tot[i / 2].end());
}
int ret = 0;
for (string& s : dy) {
if (tot.size() != s.size()) continue;
int f = 1;
for (int i = 0; i < s.size(); ++ i) {
if (count(tot[i].begin(), tot[i].end(), s[i]) == 0) {
f = 0;
break;
}
}
if (f) ++ ret;
}
return ret;
}
};
/**
* Your Encrypter object will be instantiated and called as such:
* Encrypter* obj = new Encrypter(keys, values, dictionary);
* string param_1 = obj->encrypt(word1);
* int param_2 = obj->decrypt(word2);
*/
75 场双周
第一题
class Solution {
public:
int minBitFlips(int st, int gl) {
int ret = 0;
for (int i = 0; i < 32; ++ i) {
if ((st & (1 << i)) != (gl & (1 << i))) ++ ret;
}
return ret;
}
};
第二题
class Solution {
public:
int triangularSum(vector<int>& nums) {
vector<int> t;
while ((int)nums.size() > 1) {
for (int i = 1; i < nums.size(); ++ i) {
t.push_back((nums[i] + nums[i - 1]) % 10 );
}
nums = t;
t.clear();
}
return nums[0];
}
};
第三题
class Solution {
public:
long long numberOfWays(string s) {
long long ret = 0, n0 = 0, n1 = 0, n01 = 0, n10 = 0;
for (char& c : s) {
if (c == '1') {
n01 += n0;
++ n1;
ret += n10;
}
else {
n10 += n1;
++ n0;
ret += n01;
}
}
return ret;
}
};
第四题
Z数组
class Solution {
public:
long long sumScores(string s) {
int n = s.size();
vector<int> z(n);
int l = 0, r = 0;
long long ret = 0;
for (int i = 1; i < n; ++ i) {
z[i] = min(z[i - l], r - i + 1);
while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
l = i;
r = i + z[i];
++ z[i];
}
r = max(i, r);
ret += z[i];
}
return ret + n;
}
};
后缀数组
class Solution {
public:
static const int N = 1E5 + 5;
int n, m;
char s[N];
int sa[N], x[N], y[N], c[N], rk[N], height[N];
void get_sa()
{
for (int i = 1; i <= n; i ++ ) c[x[i] = s[i]] ++ ;
for (int i = 2; i <= m; i ++ ) c[i] += c[i - 1];
for (int i = n; i; i -- ) sa[c[x[i]] -- ] = i;
for (int k = 1; k <= n; k <<= 1)
{
int num = 0;
for (int i = n - k + 1; i <= n; i ++ ) y[ ++ num] = i;
for (int i = 1; i <= n; i ++ )
if (sa[i] > k)
y[ ++ num] = sa[i] - k;
for (int i = 1; i <= m; i ++ ) c[i] = 0;
for (int i = 1; i <= n; i ++ ) c[x[i]] ++ ;
for (int i = 2; i <= m; i ++ ) c[i] += c[i - 1];
for (int i = n; i; i -- ) sa[c[x[y[i]]] -- ] = y[i], y[i] = 0;
swap(x, y);
x[sa[1]] = 1, num = 1;
for (int i = 2; i <= n; i ++ )
x[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) ? num : ++ num;
if (num == n) break;
m = num;
}
}
void get_height()
{
for (int i = 1; i <= n; i ++ ) rk[sa[i]] = i;
for (int i = 1, k = 0; i <= n; i ++ )
{
if (rk[i] == 1) continue;
if (k) k -- ;
int j = sa[rk[i] - 1];
while (i + k <= n && j + k <= n && s[i + k] == s[j + k]) k ++ ;
height[rk[i]] = k;
}
}
long long sumScores(string st) {
for (int i = 1; i <= st.size(); ++ i) {
s[i] = st[i - 1];
}
n = strlen(s + 1);
m = 'z';
get_sa();
get_height();
long long ret = 0;
int idx = rk[1];
int len = n;
for (int i = idx; i >= 1; -- i) {
ret += len;
len = min(len, height[i]);
}
len = n;
for (int i = idx + 1; i <= n; ++ i) {
len = min(len, height[i]);
ret += len;
}
return ret;
}
};
二分哈希
class Solution {
public:
static const int mod = 1e9 + 7;
long long sumScores(string s) {
int n = s.size();
vector<int> f(n + 1), g(n + 1);
for (int i = 1; i <= n; ++ i) {
f[i] = ((long long)f[i - 1] * 171 + s[i - 1]) % mod;
}
g[0] = 1;
for (int i = 1; i <= n; ++ i) {
g[i] = ((long long)g[i - 1] * 171) % mod;
}
long long ret = 0;
for (int i = 1; i <= n; ++ i) {
int l = 0, r = n - i + 1 + 1;
while (l < r) {
int mid = l + r >> 1;
int h = ((long long)f[i + mid - 1] - (long long)f[i - 1] * g[mid] % mod + mod) % mod;
if (f[mid] == h) l = mid + 1;
else r = mid;
}
ret += l - 1;
}
return ret;
}
};
139 场单周
第一题
class Solution {
public:
string gcdOfStrings(string str1, string str2) {
string ret;
for (int i = 1; i <= min((int)str1.size(), (int)str2.size()); ++ i) {
string t = str1.substr(0, i);
if (str1.size() % i || str2.size() % i) continue;
int f = 1;
for (int j = 0; j < str1.size(); ++ j) {
if (str1[j] != t[j % i]) {
f = 0;
break;
}
}
if (f == 0) continue;
for (int j = 0; j < str2.size(); ++ j) {
if (str2[j] != t[j % i]) {
f = 0;
break;
}
}
if (f) ret = t;
}
return ret;
}
};
第二题
class Solution {
public:
unordered_map<string, int> cnt;
int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {
int ret = 0;
for (auto& it : matrix) {
if (it[0] == 1) {
string t;
for (int& i : it) {
if (i == 1) t += '1';
else t += '0';
}
cnt[t] ++;
continue;
}
}
for (auto& it : matrix) {
if (it[0] == 1) continue;
string t;
for (int& i : it) {
if (i == 0) {
t += '1';
}else t += '0';
}
cnt[t] ++;
}
for (auto& [c, v] : cnt) {
ret = max(ret, v);
}
return ret;
}
};
第三题
补题中...
第四题
class Solution {
public:
int numSubmatrixSumTarget(vector<vector<int>>& mx, int target) {
int n = mx.size();
int m = mx[0].size();
vector<vector<int> > pre(n, vector<int>(m));
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (i == 0 && j == 0) {
pre[i][j] = mx[i][j];
}
else if (i == 0) {
pre[i][j] = mx[i][j] + pre[i][j - 1];
}else if (j == 0) {
pre[i][j] = mx[i][j] + pre[i - 1][j];
}else {
pre[i][j] = mx[i][j] + pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1];
}
}
}
// for (auto& it : pre) {
// for (int x : it) {
// cout << x << " ";
// }
// cout << endl;
// }
// cout << endl;
int ret = 0;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (mx[i][j] == target) ++ ret;
for (int u = i; u < n; ++ u) {
for (int k = j; k < m; ++ k) {
if (u == i && k == j) continue;
int t = pre[u][k];
if (i != 0) {
t -= pre[i - 1][k];
}
if (j != 0) {
t -= pre[u][j - 1];
}
if (i != 0 && j != 0) {
t += pre[i - 1][j - 1];
}
if (t == target) ++ ret;
}
}
}
}
return ret;
}
};
135 场单周
第一题
class Solution {
public:
int gcd(int a, int b) {
return b == 0? a : gcd(b, a % b);
}
bool isBoomerang(vector<vector<int>>& ps) {
int a1 = ps[1][0] - ps[0][0];
int b1 = ps[1][1] - ps[0][1];
if (a1 == 0 && b1 == 0) return false;
int t1 = gcd(a1, b1);
a1 /= t1;
b1 /= t1;
int a2 = ps[2][0] - ps[0][0];
int b2 = ps[2][1] - ps[0][1];
int t2 = gcd(a2, b2);
if (a2 == 0 && b2 == 0) return false;
a2 /= t2;
b2 /= t2;
// cout << a1 << " " << b1 << " " << a2 << " " << b2 << endl;
return !(a1 == a2 && b1 == b2);
}
};
第二题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int t = 0;
void dfs3(TreeNode* root) {
if (root->right) {
dfs3(root->right);
}
t += root->val;
root->val = t;
if (root->left) {
dfs3(root->left);
}
}
TreeNode* bstToGst(TreeNode* root) {
dfs3(root);
return root;
}
};
第三题
class Solution {
public:
int minScoreTriangulation(vector<int>& vs) {
int n = vs.size();
vector<vector<int> > dp(n, vector<int>(n));
for (int len = 3; len <= n; ++ len) {
for (int i = 0; i + len - 1 < n; ++ i) {
int j = i + len - 1;
for (int k = i + 1; k < j; ++ k) {
if (dp[i][j] == 0) {
dp[i][j] = vs[i] * vs[j] * vs[k] + dp[i][k] + dp[k][j];
}else {
dp[i][j] = min(dp[i][j], vs[i] * vs[j] * vs[k] + dp[i][k] + dp[k][j]);
}
}
}
}
return dp[0][n - 1];
}
};
第四题
class Solution {
public:
vector<int> numMovesStonesII(vector<int>& st) {
sort(st.begin(), st.end());
int n = st.size();
int mx = st[n - 1] - st[0] + 1 - n;
mx -= min(st[n - 1] - st[n - 2] - 1, st[1] - st[0] - 1);
int mi = mx;
int i = 0, j = 0;
for (int i = 0; i < n; ++ i) {
while (j + 1 < n && st[j + 1] <= st[i] + n - 1) ++ j;
int t = n - (j - i + 1);
if (j - i + 1 == n - 1 && st[j] == st[i] + n - 2) t = 2;
mi = min(mi, t);
}
return {mi, mx};
}
};
198 场周赛
第一题
class Solution {
public:
int numWaterBottles(int num, int e) {
int ret = num;
while (num) {
ret += num / e;
num = num / e + num % e;
if (num < e) break;
}
return ret;
}
};
第二题
class Solution {
public:
static const int N = 2E5 + 5;
int h[N], e[N], ne[N], idx;
string ls;
vector<int> ret;
int cnt[26];
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void dfs(int u, int f) {
ret[u] -= cnt[ls[u] - 'a'];
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
dfs(j, u);
}
ret[u] += ++ cnt[ls[u] - 'a'];
}
vector<int> countSubTrees(int n, vector<vector<int>>& es, string ls) {
this->ls = ls;
memset(h, -1, sizeof h);
for (auto& it : es) {
add(it[0], it[1]);
add(it[1], it[0]);
}
ret.assign(n, 0);
dfs(0, - 1);
return ret;
}
};
class Solution {
public:
static const int N = 2E5 + 5;
int h[N], e[N], ne[N], idx;
int sz[N], son[N];
int cnt[26];
string ls;
vector<int> ret;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void dfs1(int u, int f) {
sz[u] = 1;
son[u] = -1;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
dfs1(j, u);
if (son[u] == - 1 || sz[son[u]] < sz[j]) son[u] = j;
sz[u] += sz[j];
}
}
void update(int u, int sign, int pson, int f) {
cnt[ls[u] - 'a'] += sign;
for (int i = h[u]; i != - 1; i = ne[i]) {
int j = e[i];
if (j == pson || j == f) continue;
update(j, sign, pson, u);
}
}
void dfs2(int u, int p, int f) {
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == son[u] || j == f) continue;
dfs2(j, 0, u);
}
if (son[u] != -1)
dfs2(son[u], 1, u);
update(u, 1, son[u], f);
ret[u] = cnt[ls[u] - 'a'];
if (p == 0) update(u, -1, -1, f);
}
vector<int> countSubTrees(int n, vector<vector<int>>& es, string ls) {
this->ls = ls;
// memset(son, -1, sizeof son);
ret.assign(n, 0);
memset(h, -1, sizeof h);
for (auto& it : es) {
add(it[0], it[1]);
add(it[1], it[0]);
}
dfs1(0, -1);
dfs2(0, 1, -1);
return ret;
}
};
第三题
补题中...
第四题
class Solution {
public:
int closestToTarget(vector<int>& arr, int target) {
unordered_set<int> st;
int ret = abs(arr[0] - target);
st.insert(arr[0]);
for (int& x : arr) {
unordered_set<int> nst;
nst.insert(x);
ret = min(ret, abs(x - target));
for (int v : st) {
ret = min(ret, abs((v & x) - target));
nst.insert(v & x);
}
st = nst;
}
return ret;
}
};
247 场周赛
第一题
class Solution {
public:
int maxProductDifference(vector<int>& nums) {
sort(nums.begin(), nums.end());
return (nums[nums.size() - 1] * nums[nums.size() - 2] ) - (nums[0] * nums[1]);
}
};
第二题
class Solution {
public:
vector<vector<int>> rotateGrid(vector<vector<int>>& grid, int k) {
int n = grid.size();
int m = grid[0].size();
for (int i = 0; i < (min((int)grid[0].size(), (int)grid.size())) / 2; ++ i) {
int tot = (grid[i].size() - i * 2 + grid.size() - i * 2) * 2 - 4;
int t = k % tot;
for (int j = 0; j < t; ++ j) {
int x = grid[i][i];
int u = i, o = i;
while (o < m - 1 - i) grid[u][o] = grid[u][o + 1], ++ o;
while (u < n - 1 - i) grid[u][o] = grid[u + 1][o], ++ u;
while (o > 0 + i) grid[u][o] = grid[u][o - 1], -- o;
while (u > 1 + i) grid[u][o] = grid[u - 1][o], -- u;
grid[u][o] = x;
}
}
return grid;
}
};
第三题
class Solution {
public:
long long wonderfulSubstrings(string word) {
int cnt[1025];
memset(cnt, 0, sizeof cnt);
cnt[0] = 1;
long long ret = 0;
int pre = 0;
for (char c : word) {
pre ^= (1 << (c - 'a'));
ret += cnt[pre];
for (int i = 0; i < 10; ++ i) {
ret += cnt[pre ^ (1 << i)];
}
cnt[pre] ++;
}
return ret;
}
};
第四题
class Solution {
public:
static const int N = 1e5 + 5;
int p = 1e9 + 7;
typedef long long LL;
int fact[100005], infact[100005];
int qmi(int a, int k, int p) // 快速幂模板
{
int res = 1;
while (k)
{
if (k & 1) res = (LL)res * a % p;
a = (LL)a * a % p;
k >>= 1;
}
return res;
}
int h[N], e[N], ne[N], idx;
int sz[N];
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
void dfs1(int u) {
sz[u] = 1;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
dfs1(j);
sz[u] += sz[j];
}
}
void dfs2(int u, int s, long long& ret) {
-- s;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
// cout << j << " " << s << " " << ret << endl;
ret = ret * fact[s] % p * infact[s - sz[j]] % p * infact[sz[j]] % p;
s -= sz[j];
dfs2(j, sz[j], ret);
}
}
int waysToBuildRooms(vector<int>& pm) {
// 预处理阶乘的余数和阶乘逆元的余数
fact[0] = infact[0] = 1;
for (int i = 1; i < N; i ++ )
{
fact[i] = (LL)fact[i - 1] * i % p;
infact[i] = (LL)infact[i - 1] * qmi(i, p - 2, p) % p;
}
memset(h, -1, sizeof h);
for (int i = 1; i < pm.size(); ++ i) {
add(pm[i], i);
}
dfs1(0);
long long ret = 1;
dfs2(0, sz[0], ret);
return ret;
}
};
114 场周赛
第一题
class Solution {
public:
bool isAlienSorted(vector<string>& ws, string odr) {
unordered_map<char, int> mp;
for (int i = 0; i < odr.size(); ++ i) {
mp[odr[i]] = i;
}
for (int i = 1; i < ws.size(); ++ i) {
int f = 2;
for (int j = 0; j < min((int)ws[i].size(), (int)ws[i - 1].size()); ++ j) {
if (mp[ws[i][j]] > mp[ws[i - 1][j]]) {
f = 1;
break;
}else if (mp[ws[i][j]] < mp[ws[i - 1][j]]) {
f = 0;
break;
}
}
if (f == 0 || (f == 2 && ws[i].size() < ws[i - 1].size())) return false;
}
return true;
}
};
第二题
class Solution {
public:
bool canReorderDoubled(vector<int>& arr) {
unordered_map<int, int> mp;
sort(arr.begin(), arr.end());
int k = 0;
for (int i = 0; i < arr.size(); ++ i) {
if (arr[i] < 0) {
if (mp[arr[i] * 2] > 0) {
-- mp[arr[i] * 2];
-- k;
}else {
mp[arr[i]] ++;
++ k;
}
}else {
if (arr[i] % 2 == 0 && mp[arr[i] / 2] > 0) {
-- mp[arr[i] / 2];
-- k;
}else {
mp[arr[i]] ++;
++ k;
}
}
}
return k == 0;
}
};
第三题
class Solution {
public:
int minDeletionSize(vector<string>& strs) {
int ret = 0;
vector<string> st(strs.size() + 1);
// if (st[0] <= st[1]) {
// cout << "ok" << endl;
// }
for (int i = 0; i < strs[0].size(); ++ i) {
int f = 1;
for (int j = 1; j < strs.size(); ++ j) {
if (strs[j][i] < strs[j - 1][i] && st[j - 1] == st[j]) {
f = 0;
break;
}
}
if (f) {
for (int j = 0; j < strs.size(); ++ j) {
st[j] += strs[j][i];
}
}
}
// cout << st[0] << endl;
return strs[0].size() - st[0].size();
}
};
第四题
class Solution {
public:
int tallestBillboard(vector<int>& rods) {
unordered_map<int, int> dp;
dp[0] = 0;
for (int& x : rods) {
unordered_map<int, int> tmp(dp);
for (auto& it : tmp) {
int key = it.first;
dp[key + x] = max(dp[key + x], tmp[key] + x);
dp[key - x] = max(dp[key - x], tmp[key]);
}
}
return dp[0];
}
};
168 场周赛
第一题
class Solution {
public:
int get(int x) {
int cnt = 0;
while (x) {
++ cnt;
x /= 10;
}
return cnt;
}
int findNumbers(vector<int>& nums) {
int ret = 0;
for (int& x : nums) {
if (get(x) % 2 == 0) ++ ret;
}
return ret;
}
};
第二题
class Solution {
public:
unordered_map<int, int> mp;
bool isPossibleDivide(vector<int>& nums, int k) {
if (nums.size() % k != 0) return false;
sort(nums.begin(), nums.end());
for (int& i : nums) mp[i] ++;
nums.erase(unique(nums.begin(), nums.end()), nums.end());
int j = 0;
while (j < nums.size()) {
if (mp[nums[j]] == 0) {
++ j;
continue;
}
-- mp[nums[j]];
// cout << nums[j] << " ";
for (int i = j + 1; i < j + k; ++ i) {
// cout << nums[i] << " ";
if (nums[i] != nums[i - 1] + 1 || mp[nums[i]] <= 0 ) {
return false;
}
else -- mp[nums[i]];
}
// cout << endl;
}
return true;
}
};
第三题
class Solution {
public:
string wd;
int df = 0;
int cnt[26];
unordered_map<string, int> mp;
void add(char c) {
wd += c;
if (cnt[c - 'a'] == 0) ++ df;
cnt[c - 'a'] ++;
}
void del(char c) {
cnt[c - 'a'] --;
if (cnt[c - 'a'] == 0) -- df;
wd = wd.substr(1, wd.size());
}
int maxFreq(string s, int ms, int mie, int mae) {
int ret = 0;
for (int len = mie; len <= mae; ++ len) {
memset(cnt, 0, sizeof cnt);
int l = 0, r = 0;
df = 0;
wd = "";
while (r < s.size()) {
add(s[r ++]);
if (r - l < len) {
continue;
}
if (df <= ms) {
// cout << df << " " << wd << endl;
mp[wd] ++;
ret = max(mp[wd], ret);
}
del(s[l ++]);
}
}
return ret;
}
};
第四题
class Solution {
public:
int maxCandies(vector<int>& ss, vector<int>& cs, vector<vector<int>>& ks, vector<vector<int>>& cons, vector<int>& is) {
unordered_set<int> st;
for (int i : is) st.insert(i);
int ret = 0;
for (int i = 0; i < 1005; ++ i) {
vector<int> del;
vector<int> add;
for (int x : st) {
// cout << x << endl;
if (ss[x]) {
for (int& j : cons[x]) add.push_back(j);
for (int& j : ks[x]) {
ss[j] = 1;
}
del.push_back(x);
ret += cs[x];
}
}
for (int& x : del) {
st.erase(st.find(x));
}
for (int& x : add) {
st.insert(x);
}
}
return ret;
}
};
245 场单周
第一题
class Solution {
public:
bool makeEqual(vector<string>& words) {
int cnt[26];
memset(cnt, 0, sizeof cnt);
for (auto& s : words) {
for (char c : s) {
cnt[c - 'a'] ++;
}
}
for (int i = 0; i < 26; ++ i) {
if (cnt[i] % words.size() != 0) return false;
}
return true;
}
};
第二题
class Solution {
public:
int maximumRemovals(string s, string p, vector<int>& re) {
unordered_set<int> st;
int l = 0, r = re.size();
int k = -1;
while (l < r) {
int mid = l + r >> 1;
while (k < mid) {
st.insert(re[++ k]);
}
while (k > mid) {
st.erase(st.find(re[k --]));
}
int j = 0;
for (int i = 0; i < s.size(); ++ i) {
if (st.count(i)) continue;
if (s[i] == p[j]) ++ j;
if (j == p.size()) break;
}
// cout << j << endl;
if (j != p.size()) r = mid;
else l = mid + 1;
}
return l;
}
};
第三题
class Solution {
public:
bool mergeTriplets(vector<vector<int>>& ts, vector<int>& tt) {
int cnt[3];
memset(cnt, 0, sizeof cnt);
for (auto& it : ts) {
int a = it[0], b = it[1], c = it[2];
if (a == tt[0] && b <= tt[1] && c <= tt[2]) cnt[0] = 1;
if (b == tt[1] && a <= tt[0] && c <= tt[2]) cnt[1] = 1;
if (c == tt[2] && a <= tt[0] && b <= tt[1]) cnt[2] = 1;
if (cnt[0] && cnt[1] && cnt[2]) return true;
}
return false;
}
};
第四题
class Solution {
private:
int F[30][30][30], G[30][30][30];
public:
pair<int, int> dp(int n, int f, int s) {
if (F[n][f][s]) {
return {F[n][f][s], G[n][f][s]};
}
if (f + s == n + 1) {
return {1, 1};
}
// F(n,f,s) = F(n,n+1-s,n+1-f)
if (f + s > n + 1) {
tie(F[n][f][s], G[n][f][s]) = dp(n, n + 1 - s, n + 1 - f);
return {F[n][f][s], G[n][f][s]};
}
int earlist = INT_MAX, latest = INT_MIN;
int n_half = (n + 1) / 2;
if (s <= n_half) {
// 在左侧或者中间
for (int i = 0; i < f; ++ i) {
for (int j = 0; j < s - f; ++ j) {
auto [x, y] = dp(n_half, i + 1, i + j + 2);
earlist = min(earlist, x);
latest = max(latest, y);
}
}
}
else {
// s 在右侧
// s'
int s_prime = n + 1 - s;
int mid = (n - 2 * s_prime + 1) / 2;
for (int i = 0; i < f; ++i) {
for (int j = 0; j < s_prime - f; ++j) {
auto [x, y] = dp(n_half, i + 1, i + j + mid + 2);
earlist = min(earlist, x);
latest = max(latest, y);
}
}
}
return {F[n][f][s] = earlist + 1, G[n][f][s] = latest + 1};
}
vector<int> earliestAndLatest(int n, int firstPlayer, int secondPlayer) {
memset(F, 0, sizeof(F));
memset(G, 0, sizeof(G));
// F(n,f,s) = F(n,s,f)
if (firstPlayer > secondPlayer) {
swap(firstPlayer, secondPlayer);
}
auto [earlist, latest] = dp(n, firstPlayer, secondPlayer);
return {earlist, latest};
}
};
286 场单周
第一题
class Solution {
public:
vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> st1, st2;
for (int i : nums1) {
st1.insert(i);
}
for (int i : nums2) {
st2.insert(i);
}
unordered_set<int> st3;
vector<vector<int> > ret(2);
for (int i : nums1) {
if (!st3.count(i) && !st2.count(i)) {
st3.insert(i);
ret[0].push_back(i);
}
}
unordered_set<int> st4;
for (int i : nums2) {
if (!st4.count(i) && !st1.count(i)) {
st4.insert(i);
ret[1].push_back(i);
}
}
return ret;
}
};
第二题
class Solution {
public:
int minDeletion(vector<int>& nums) {
if (nums.size() == 1) return 1;
int ret = 0;
int k = 0;
for (int i = 0; i < nums.size(); ++ i) {
// cout << k << " " << nums[i] << endl;
if (k % 2 == 0 && i + 1 < nums.size() && nums[i] == nums[i + 1]) {
++ ret;
}else ++ k;
}
if ((nums.size() - ret) % 2) ++ ret;
return ret;
}
};
第三题
class Solution {
public:
vector<long long> kthPalindrome(vector<int>& qs, int ih) {
vector<long long> ret;
for (int& x : qs) {
int k = (ih + 1) / 2;
long long p = 1;
for (int i = 0; i < k - 1; ++ i) {
p *= 10;
}
if (x > 9 * p) {
ret.push_back(-1);
}else {
long long res = p + x - 1;
string t = to_string(res);
t.resize(ih - k);
reverse(t.begin(), t.end());
for (char c : t) {
res = res * 10 + (c - '0');
}
ret.push_back(res);
}
}
return ret;
}
};
第四题
class Solution {
public:
int f[1005][2005];
int sum[1005][2005];
int maxValueOfCoins(vector<vector<int>>& ps, int k) {
memset(f, 0, sizeof f);
memset(sum, 0, sizeof sum);
for (int i = 1; i <= ps.size(); ++ i) {
for (int j = 1; j <= ps[i - 1].size(); ++ j) {
sum[i][j] = sum[i][j - 1] + ps[i - 1][j - 1];
}
}
for (int i = 1; i <= ps.size(); ++ i) {
for (int j = 0; j <= k; ++ j) {
for (int u = 0; u <= min(j, (int)ps[i - 1].size()); ++ u) {
f[i][j] = max(f[i][j], f[i - 1][j - u] + sum[i][u]);
}
}
}
return f[ps.size()][k];
}
};
152 场单周
第一题
class Solution {
public:
bool is_prim(int x) {
for (int i = 2; i <= x / i; ++ i) {
if (x % i == 0) return false;
}
return true;
}
int numPrimeArrangements(int n) {
int cnt = 0;
for (int i = 2; i <= n; ++ i) {
if (is_prim(i)) ++ cnt;
}
long long ret = 1;
int mod = 1e9 + 7;
for (int i = cnt; i >= 1; -- i) {
ret *= i;
ret %= mod;
}
for (int i = n - cnt; i >= 1; -- i) {
ret *= i;
ret %= mod;
}
return ret;
}
};
第三题
int len;
int get(int x) {
return x / len;
}
class Solution {
public:
int cnt[26];
struct node{
int l, r, k, id;
bool operator< (const node& n) {
if (get(l) != get(n.l)) {
return get(l) < get(n.l);
}
return r < n.r;
}
}qm[100005];
void add(char c) {
cnt[c - 'a'] ++;
}
void del(char c) {
cnt[c - 'a'] --;
}
vector<bool> canMakePaliQueries(string s, vector<vector<int>>& qs) {
len = sqrt(qs.size());
for (int i = 0; i < qs.size(); ++ i) {
qm[i] = {qs[i][0], qs[i][1], qs[i][2], i};
}
sort(qm, qm + (int)qs.size());
vector<bool> ret(qs.size(), false);
memset(cnt, 0, sizeof cnt);
for (int i = 0, j = -1, u = 0; u < qs.size(); ++ u) {
int l = qm[u].l, r = qm[u].r, k = qm[u].k, id = qm[u].id;
// cout << i << " " << l << " " << r << " " << k << " " << id << endl;
while (i < l) del(s[i ++]);
while (i > l) add(s[-- i]);
while (j > r) del(s[j --]);
while (j < r) add(s[++ j]);
k *= 2;
// cout << k << endl;
int tot = 0;
for (int i = 0; i < 26; ++ i) {
if (cnt[i] % 2) -- k;
tot += cnt[i];
}
if (tot % 2) ++ k;
if (k >= 0) ret[id] = true;
else ret[id] = false;
}
return ret;
}
};
第四题
class Solution {
public:
unordered_map<char, unordered_map<int, int> > mp;
vector<int> findNumOfValidWords(vector<string>& ws, vector<string>& ps) {
for (string& s : ws) {
int k = 0;
for (int i = 0; i < s.size(); ++ i) {
char c = s[i];
k |= (1 << (c - 'a'));
}
// cout << k << endl;
unordered_set<char> st;
for (int i = 0; i < s.size(); ++ i) {
if (st.count(s[i])) continue;
mp[s[i]][k] ++;
st.insert(s[i]);
}
}
vector<int> ret(ps.size());
for (int i = 0; i < ps.size(); ++ i) {
// cout << ps[i] << endl;
for (int j = 1; j < 1 << ps[i].size(); ++ j) {
int t = 0;
for (int k = 0; k < ps[i].size(); ++ k) {
char c = ps[i][k];
if ((j >> k) & 1) {
t |= (1 << (c -'a'));
}
}
// cout << "t " << t << endl;
ret[i] += mp[ps[i][0]][t];
}
}
return ret;
}
};
84 场单周
第一题
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
vector<vector<int> > ret(image.size());
for (int i = 0; i < image.size(); ++ i) {
reverse(image[i].begin(), image[i].end());
for (int j = 0; j < image[i].size(); ++ j) {
if (image[i][j]) ret[i].push_back(0);
else ret[i].push_back(1);
}
}
return ret;
}
};
第二题
class Solution {
public:
unordered_map<int, vector<string>> mp;
string findReplaceString(string s, vector<int>& is, vector<string>& ss, vector<string>& ts) {
string ret;
for (int i = 0; i < is.size(); ++ i) {
mp[is[i]].push_back(ss[i]);
mp[is[i]].push_back(ts[i]);
}
sort(is.begin(), is.end());
for (int i = 0; i < s.size(); ++ i) {
if (count(is.begin(), is.end(), i) != 0) {
string t = mp[i][0];
int sz = t.size();
string tt = mp[i][1];
int f = 1;
string ttt;
if (i + sz > s.size()) f = 0;
for (int j = i; j < min((int)s.size(), i + sz); ++ j) {
if (t[j - i] != s[j]) {
f = 0;
}
ttt += s[j];
}
if (f) {
ret += tt;
}else {
ret += ttt;
}
i += sz - 1;
continue;
}
ret += s[i];
}
return ret;
}
};
第三题
class Solution {
public:
int largestOverlap(vector<vector<int>>& img1, vector<vector<int>>& img2) {
int ret = 0;
int n = img1.size();
int m = img2[0].size();
vector<vector<int> > img3(3 * n, vector<int>(3 * m, 0));
for (int i = n; i < 2 * n; ++ i) {
for (int j = m; j < 2 * m; ++ j) {
img3[i][j] = img2[i - n][j - m];
}
}
for (int i = 0; i < 3 * n; ++ i) {
for (int j = 0; j < 3 * m; ++ j) {
// cout << img3[i][j] << " ";
int t = 0;
for (int u = i; u < min(3 * n, i + n); ++ u) {
for (int k = j; k < min(3 * m, j + m); ++ k) {
if (img1[u - i][k - j] && img1[u - i][k - j] == img3[u][k]) ++ t;
}
}
ret = max(ret, t);
}
// cout << endl;
}
return ret;
}
};
第四题
class Solution {
public:
static const int N = 1e5;
int h[N], e[N], ne[N], sz[N], idx;
vector<int> ret;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
void dfs1(int u, int f) {
sz[u] = 1;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
dfs1(j, u);
sz[u] += sz[j];
ret[u] += ret[j] + sz[j];
}
}
void dfs2(int u, int f) {
if (f != -1) {
// if (u == 3) {
// cout << ret[f] << " " << sz[f] << " " << sz[u] << endl;
// }
ret[u] = ret[f] - sz[u] + sz[f] - sz[u];
sz[u] = sz[f];
}
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (j == f) continue;
dfs2(j, u);
}
}
vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& es) {
if (n == 1) return {0};
ret.assign(n, 0);
memset(h, -1, sizeof h);
idx = 0;
for (auto& it : es) {
add(it[0], it[1]);
add(it[1], it[0]);
}
dfs1(0, -1);
dfs2(0, -1);
return ret;
}
};
170 场单周
第一题
class Solution {
public:
string freqAlphabets(string s) {
string ret;
for (int i = 0; i < s.size(); ++ i) {
string t;
while (i < s.size() && s[i] >= '0' && s[i] <= '9') {
t += s[i];
++ i;
}
if (i < s.size()) {
reverse(t.begin(), t.end());
while ((int)t.size() > 2) {
char c = t.back();
t.pop_back();
ret += (char) ('a' + c - '1');
}
int k = t[1] - '0';
k *= 10;
k += t[0] - '0';
ret += (char) ('j' + k - 10);
}
else if (i == s.size() && t.size() ) {
reverse(t.begin(), t.end());
while ((int)t.size()) {
char c = t.back();
t.pop_back();
ret += (char) ('a' + c - '1');
}
}
}
return ret;
}
};
第二题
int len;
int get(int x) {
return x / len;
}
class Solution {
public:
int tt = 0;
void add(int x) {
tt ^= x;
}
struct node{
int l, r, id;
bool operator< (const node& a) const {
if (get(l) != get(a.l)) return get(l) < get(a.l);
else return r < a.r;
}
}qm[100005];
vector<int> xorQueries(vector<int>& ar, vector<vector<int>>& qs) {
len = sqrt(ar.size());
vector<int> ret(qs.size());
for (int i = 0; i < qs.size(); ++ i) {
qm[i] = {qs[i][0], qs[i][1], i};
}
sort(qm, qm + (int)qs.size());
for (int i = 0, j = -1, k = 0; k < qs.size(); ++ k) {
int id = qm[k].id, l = qm[k].l, r = qm[k].r;
while (i > l) add(ar[-- i]);
while (i < l) add(ar[i ++]);
while (j < r) add(ar[++ j]);
while (j > r) add(ar[j --]);
ret[id] = tt;
}
return ret;
}
};
第三题
class Solution {
public:
int q[105];
vector<string> watchedVideosByFriends(vector<vector<string>>& ws, vector<vector<int>>& fs, int id, int lv) {
unordered_set<int> st;
unordered_map<string, int> cnt;
int hh = 0, tt = -1;
q[++ tt] = id;
st.insert(id);
while (hh <= tt) {
int sz = tt - hh + 1;
for (int i = 0; i < sz; ++ i) {
int t = q[hh ++];
for (int& x : fs[t]) {
if (!st.count(x)) {
st.insert(x);
q[++ tt] = x;
}
}
}
if (-- lv == 0) break;
}
while (hh <= tt) {
int t = q[hh ++];
// cout << t << endl;
for (string& s : ws[t]) {
cnt[s] ++;
}
}
vector<pair<string, int> > pt;
for (auto& [s, ct] : cnt) {
pt.push_back({s, ct});
}
sort(pt.begin(), pt.end(), [](pair<string, int>& a, pair<string, int>& b) {
if (a.second != b.second) return a.second < b.second;
else return a.first < b.first;
});
vector<string> ret;
for (auto& [s, _] : pt) ret.push_back(s);
return ret;
}
};
第四题
class Solution {
public:
int f[505][505];
int minInsertions(string s) {
memset(f, 0x3f, sizeof 0x3f);
int n = s.size();
for (int len = 1; len <= n; ++ len) {
for (int i = 0; i + len - 1 < n; ++ i) {
int j = i + len - 1;
if (i == j) {
f[i][i] = 0;
}
else {
if (s[i] == s[j]) {
f[i][j] = f[i + 1][j - 1];
}else {
f[i][j] = min(f[i + 1][j], f[i][j - 1]) + 1;
}
}
}
}
return f[0][n - 1];
}
};
145 场单周
第一题
class Solution {
public:
vector<int> relativeSortArray(vector<int>& a1, vector<int>& a2) {
vector<int> ret;
map<int, int> mp;
for (int& i : a1) {
mp[i] ++;
}
for (int i = 0; i < a2.size(); ++ i) {
for (int j = 0; j < mp[a2[i]]; ++ j) {
ret.push_back(a2[i]);
}
mp.erase(a2[i]);
}
for (auto& [v, c] : mp) {
for (int i = 0; i < c; ++ i) {
ret.push_back(v);
}
}
return ret;
}
};
第二题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int f[1005][13];
TreeNode* q[1005];
int d[1005];
vector<int> ye;
int len = 1;
unordered_map<int, TreeNode*> mp;
void bfs(TreeNode* root) {
int hh = 0, tt = -1;
q[++ tt] = root;
int dep = 1;
while (hh <= tt) {
int sz = tt - hh + 1;
for (int i = 0; i < sz; ++ i) {
TreeNode* t = q[hh ++];
d[t->val] = dep;
mp[t->val] = t;
if ( t && t-> left) {
q[++ tt] = t->left;
int val = t->left->val;
f[val][0] = t->val;
for (int i = 1; i < 12; ++ i) {
f[val][i] = f[f[val][i - 1]][i - 1];
}
}
if ( t && t-> right) {
q[++ tt] = t->right;
int val = t->right->val;
f[val][0] = t->val;
for (int i = 1; i < 12; ++ i) {
f[val][i] = f[f[val][i - 1]][i - 1];
}
}
if (t && !t->left && !t->right) {
if (d[t->val] == len)
ye.push_back(t->val);
else if (d[t->val] > len) {
ye.clear();
len = d[t->val];
ye.push_back(t->val);
}
}
}
++ dep;
}
}
void dfs(TreeNode* root) {
root->val += 1;
if (root->left) dfs(root->left);
if (root->right) dfs(root->right);
}
void dfs2(TreeNode* root) {
cout << root->val << endl;
if (root->left) dfs2(root->left);
if (root->right) dfs2(root->right);
}
void dfs3(TreeNode* root) {
root->val -= 1;
if (root->left) dfs3(root->left);
if (root->right) dfs3(root->right);
}
TreeNode* lcaDeepestLeaves(TreeNode* root) {
dfs(root);
// dfs2(root);
ye.clear();
bfs(root);
// for (int i : ye) cout << i << " ";
// cout << endl;
if (ye.size() == 1) {
dfs3(mp[ye[0]]);
return mp[ye[0]];
}
TreeNode* ret = NULL;
for (int i = 0; i < ye.size(); ++ i) {
for (int j = i + 1; j < ye.size(); ++ j) {
int a = ye[i], b = ye[j];
if (d[a] < d[b]) swap(a, b);
for (int i = 0; i < 12; ++ i) {
if (d[f[a][i]] >= d[b]) a = f[a][i];
}
if (a == b) {
if ( ret == NULL || d[a] < d[ret->val]) {
ret = mp[a];
}
break;
}
for (int i = 11; i >= 0; -- i) {
if (f[a][i] != f[b][i]) {
a = f[a][i];
b = f[b][i];
}
}
a = f[a][0];
if (ret == NULL || d[a] < d[ret->val]) {
ret = mp[a];
}
}
}
dfs3(ret);
return ret;
}
};
第三题
class Solution {
public:
int pre[10005];
int longestWPI(vector<int>& hs) {
int n = hs.size();
for (int i = 1; i <= n; ++ i) {
pre[i] = pre[i - 1];
if (hs[i - 1] > 8) pre[i] += 1;
else pre[i] -= 1;
}
for (int len = n; len >= 1; -- len) {
for (int i = 1; i + len - 1 <= n; ++ i) {
int j = i + len - 1;
if (pre[j] - pre[i - 1] > 0) return len;
}
}
return 0;
}
};
第四题
class Solution {
public:
unordered_map<string, int> mp;
vector<int> smallestSufficientTeam(vector<string>& rs, vector<vector<string>>& pe) {
for (int i = 0; i < rs.size(); ++ i) {
mp[rs[i]] = i;
}
vector<int> skill(pe.size());
for (int i = 0; i < pe.size(); ++ i) {
for (auto& s : pe[i]) {
skill[i] |= 1 << mp[s];
}
}
vector<vector<int> > dp(1 << rs.size());
for (int i = 0; i < 1 << rs.size(); ++ i) {
if (i && dp[i].size() == 0) continue;
for (int j = 0; j < pe.size(); ++ j) {
if (skill[j] == 0) continue;
int ns = i | skill[j];
if (dp[ns].size() == 0 || dp[i].size() + 1 < dp[ns].size()) {
dp[ns] = dp[i];
dp[ns].push_back(j);
}
}
}
return dp[(1 << rs.size()) - 1];
}
};
259 场单周
第一题
class Solution {
public:
int finalValueAfterOperations(vector<string>& os) {
int ret = 0;
for (string& s : os) {
if (s[1] == '+') ++ ret;
else -- ret;
}
return ret;
}
};
第二题
class Solution {
public:
int sumOfBeauties(vector<int>& nums) {
int ret = 0;
vector<int> pre(nums.size() + 1);
pre[nums.size()] = 100005;
for (int i = nums.size() - 1; i >= 0; -- i) {
pre[i] = min(nums[i], pre[i + 1]);
}
int k = nums[0];
for (int i = 1; i < nums.size() - 1; ++ i) {
if (k < nums[i] && nums[i] < pre[i + 1]) {
ret += 2;
}else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
ret += 1;
}
k = max(k, nums[i]);
}
return ret;
}
};
第三题
class DetectSquares {
public:
static const int N = 1005;
int st[1005][1005];
int dx[4] = {1, 1, -1, -1};
int dy[4] = {-1, 1, 1, -1};
DetectSquares() {
memset(st, 0, sizeof st);
}
void add(vector<int> point) {
st[point[0]][point[1]] ++;
}
int count(vector<int> point) {
int ret = 0;
int x = point[0], y = point[1];
for (int i = 1; i < N; ++ i) {
for (int k = 0; k < 4; ++ k) {
int xt = x + dx[k] * i;
int yt = y + dy[k] * i;
if (xt < 0 || xt >= N || yt < 0 || yt >= N) continue;
ret += 1 * st[x][yt] * st[xt][y] * st[xt][yt];
}
}
return ret;
}
};
/**
* Your DetectSquares object will be instantiated and called as such:
* DetectSquares* obj = new DetectSquares();
* obj->add(point);
* int param_2 = obj->count(point);
*/
第四题
class Solution {
public:
unordered_map<int, int> cnt;
string s, track, ret;
int k;
void dfs() {
unordered_map<int, int> cnt2(cnt);
for (auto& [ch, ct] : cnt2) {
track += ch;
if (track.size() > ret.size() || (track.size() == ret.size() && track > ret)) {
int time = 0, pos = 0;
for (char& c : s) {
if (c == track[pos]) {
++ pos;
if (pos == track.size()) {
++ time, pos = 0;
}
}
}
if (time >= k) ret = track;
}
cnt[ch] -= k;
if (cnt[ch] < k) {
cnt.erase(ch);
}
dfs();
track.pop_back();
cnt[ch] = ct;
}
}
string longestSubsequenceRepeatedK(string s, int k) {
this->k = k;
for (char c : s) {
cnt[c] ++;
}
string to_del;
for (auto [ch, ct] : cnt) {
if (ct < k) to_del += ch;
}
for (char& c : to_del) {
cnt.erase(c);
}
for (char& c : s) {
if (cnt.count(c)) this->s += c;
}
dfs();
return ret;
}
};
112 场单周
第一题
class Solution {
public:
int minIncrementForUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
int bk = -1;
int ret = 0;
for (int i = 0; i < nums.size(); ++ i) {
if (nums[i] <= bk) {
ret += bk - nums[i] + 1;
}
bk = max(bk + 1, nums[i]);
}
return ret;
}
};
第二题
class Solution {
public:
bool validateStackSequences(vector<int>& psh, vector<int>& pop) {
stack<int> stk;
for (int i = 0, j = 0; j < pop.size() && i < psh.size(); ) {
while (i < psh.size() && pop[j] != psh[i]) {
stk.push(psh[i]);
++ i;
}
if (i == psh.size()) return false;
stk.push(psh[i ++]);
while (j < pop.size() && stk.size() && stk.top() == pop[j]) {
++ j;
stk.pop();
}
}
// cout << stk.size() << endl;
if (stk.size() == 0) return true;
return false;
}
};
第三题
class Solution {
public:
int fa[1005];
int idx;
int find(int x) {
return fa[x] == -1 ? x : fa[x] = find(fa[x]);
}
void un(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
fa[a] = b;
-- idx;
}
}
int removeStones(vector<vector<int>>& s) {
memset(fa, -1, sizeof fa);
vector<vector<int> > row(10005);
vector<vector<int> > col(10005);
idx = 0;
for (auto& it : s) {
row[it[0]].push_back(idx);
col[it[1]].push_back(idx ++);
}
int k = 0;
for (auto& it : s) {
for (int& i : row[it[0]]) {
un(k, i);
}
for (int& i : col[it[1]]) {
un(k, i);
}
++ k;
}
return s.size() - idx;
}
};
第四题
class Solution {
public:
int bagOfTokensScore(vector<int>& ts, int pr) {
sort(ts.begin(), ts.end());
int ret = 0, k = 0;
for (int i = 0, j = ts.size() - 1; i <= j; ) {
while (i <= j && pr >= ts[i]) {
pr -= ts[i];
++ k;
++ i;
}
ret = max(ret, k);
if (!k) break;
if (i <= j) {
-- k;
pr += ts[j --];
}
}
return ret;
}
};
41 场双周
第一题
class Solution {
public:
int countConsistentStrings(string ad, vector<string>& ws) {
int ret = 0;
unordered_set<char> st;
for (char c : ad) {
st.insert(c);
}
for (string s : ws) {
int f = 1;
for (char c : s) {
if (!st.count(c)) {
f = 0;
break;
}
}
if (f) ++ ret;
}
return ret;
}
};
第二题
class Solution {
public:
vector<int> getSumAbsoluteDifferences(vector<int>& nums) {
vector<int> pre(nums.size() + 1);
for (int i = nums.size() - 1; i >= 0; -- i) {
pre[i] = nums[i] + pre[i + 1];
}
vector<int> ret(nums.size());
int sum = 0;
for (int i = 0; i < nums.size(); ++ i) {
int bx = nums.size() - i - 1;
ret[i] = pre[i + 1] - bx * nums[i];
if (i != 0) {
ret[i] += i * nums[i] - sum;
}
sum += nums[i];
}
return ret;
}
};
第三题
class Solution {
public:
int stoneGameVI(vector<int>& as, vector<int>& bs) {
vector<vector<int> > ret;
for (int i = 0; i < as.size(); ++ i) {
ret.push_back({as[i] + bs[i], as[i], bs[i]});
}
sort(ret.begin(), ret.end(), [](vector<int>& a, vector<int>& b) {
return a[0] > b[0];
});
int suma = 0, sumb = 0;
int f = 1;
for (int i = 0; i < ret.size(); ++ i) {
if (f) {
suma += ret[i][1];
f = 0;
}else {
sumb += ret[i][2];
f = 1;
}
}
if (suma > sumb) return 1;
else if (suma == sumb) return 0;
else return -1;
}
};
第四题
class Solution {
public:
int q[100005];
int boxDelivering(vector<vector<int>>& bs, int pt, int ms, int mt) {
int n = bs.size();
vector<long long> w(n + 1);
vector<int> g(n + 1), f(n + 1), neg(n + 1);
for (int i = 1; i <= n; ++ i) {
w[i] = w[i - 1] + bs[i - 1][1];
}
for (int i = 2; i <= n; ++ i) {
neg[i] = neg[i - 1] + (bs[i - 1][0] != bs[i - 2][0]);
int hh = 0, tt = -1;
q[++ tt] = 0;
for (int i = 1; i <= n; ++ i) {
while (hh <= tt && (q[hh] < i - ms || w[i] - w[q[hh]] > mt)) ++ hh;
f[i] = g[q[hh]] + neg[i] + 2;
if (i != n) {
g[i] = f[i] - neg[i + 1];
}
while (hh <= tt && g[i] <= g[q[tt]]) -- tt;
q[++ tt] = i;
}
return f[n];
}
};
206 场单周
第一题
class Solution {
public:
int numSpecial(vector<vector<int>>& mat) {
int n = mat.size();
int m = mat[0].size();
vector<int> row(n);
vector<int> col(m);
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
row[i] += mat[i][j];
}
}
for (int j = 0; j < m; ++ j) {
for (int i = 0; i < n; ++ i) {
col[j] += mat[i][j];
}
}
int ret = 0;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (mat[i][j] && row[i] == 1 && col[j] == 1) ++ ret;
}
}
return ret;
}
};
第二题
class Solution {
public:
int unhappyFriends(int n, vector<vector<int>>& ps, vector<vector<int>>& pairs) {
unordered_map<int, int> mp;
for (auto& it : pairs) {
mp[it[0]] = it[1];
mp[it[1]] = it[0];
}
int ret = 0;
for (int i = 0; i < n; ++ i) {
int x = mp[i];
for (int j = 0; j < (int)ps[i].size(); ++ j) {
if (ps[i][j] == x) break;
int t = ps[i][j];
int tm = mp[t];
int f = 0;
for (int k = 0; k < (int)ps[t].size(); ++ k) {
if (ps[t][k] == tm) break;
if (ps[t][k] == i) {
// cout << i << " ";
f = 1;
++ ret;
}
}
if (f) break;
}
}
// cout << endl;
return ret;
}
};
第三题
class Solution {
public:
int fa[1005];
struct edge{
int a, b, c;
const bool operator<(const edge& e) {
return c < e.c;
}
}edges[1000006];
int get(vector<int>& a, vector<int>& b) {
int dx = abs(a[0] - b[0]);
int dy = abs(a[1] - b[1]);
return dx + dy;
}
int find(int x) {
return fa[x] == -1 ? x : fa[x] = find(fa[x]);
}
int minCostConnectPoints(vector<vector<int>>& points) {
int idx = 0;
memset(fa, -1, sizeof fa);
for (int i = 0; i < points.size(); ++ i) {
for (int j = i + 1; j < points.size(); ++ j) {
edges[idx ++] = {i, j, get(points[i], points[j])};
}
}
sort(edges, edges + idx);
int ret = 0;
for (int i = 0; i < idx; ++ i) {
int a = edges[i].a, b = edges[i].b, c = edges[i].c;
a = find(a);
b = find(b);
if (a != b) {
ret += c;
fa[a] = b;
}
}
return ret;
}
};
第四题
class Solution {
public:
bool isTransformable(string s, string t) {
vector<queue<int> > pos(10);
for (int i = 0; i < s.size(); ++ i) {
pos[s[i] - '0'].push(i);
}
for (int i = 0; i < t.size(); ++ i) {
int j = t[i] - '0';
if (pos[j].empty()) return false;
for (int k = 0; k < j; ++ k) {
if (!pos[k].empty() && pos[k].front() < pos[j].front()) return false;
}
pos[j].pop();
}
return true;
}
};
113 场单周
第一题
class Solution {
public:
string largestTimeFromDigits(vector<int>& A) {
sort(A.begin(), A.end());
string ans = "00:00";
bool flag = false;
do {
string t = "00:00";
t[0] = A[0] + '0';
t[1] = A[1] + '0';
t[3] = A[2] + '0';
t[4] = A[3] + '0';
if (t[0] > '2' || t[3] > '5') continue;
if (t[0] == '2' && t[1] > '3') continue;
if (t >= ans) {
ans = t;
flag = true;
}
} while (next_permutation(A.begin(), A.end()));
return flag ? ans : "";
}
};
第二题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool flipEquiv(TreeNode* root1, TreeNode* root2) {
if (!root1 && !root2) return true;
if ((root1 && root2 && root1 ->val != root2->val) || (root1 && !root2) || (!root1 && root2)) return false;
return (flipEquiv(root1->left, root2->right) && flipEquiv(root1->right, root2->left)) ||
(flipEquiv(root1->left, root2->left) && flipEquiv(root1->right, root2->right)) ;
}
};
第三题
class Solution {
public:
vector<int> deckRevealedIncreasing(vector<int>& deck) {
if (deck.size() <= 2) return deck;
sort(deck.begin(), deck.end());
deque<int> q;
q.push_back(deck.back());
q.push_front(deck[deck.size() - 2]);
for (int i = deck.size() - 3; i >= 0; -- i) {
q.push_front(q.back());
q.pop_back();
q.push_front(deck[i]);
}
vector<int> ret;
while (q.size()) {
ret.push_back(q.front());
q.pop_front();
}
return ret;
}
};
第四题
class Solution {
public:
static const int N = 1e5 + 5;
int primes[100005];
void init() {
for (int i = 2; i < N; ++ i) {
if (!primes[i]) primes[++ primes[0]] = i;
for (int j = 0; primes[j] <= N / i; ++ j) {
primes[primes[j] * i] = 1;
if (i % primes[j] == 0) break;
}
}
}
int fa[N], sz[N];
int ret = 1;
int find(int x ) {
return fa[x] == 0 ? x : fa[x] = find(fa[x]);
}
void un(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
fa[b] = a;
sz[a] += sz[b];
ret = max(ret, sz[a]);
}
}
int largestComponentSize(vector<int>& nums) {
init();
unordered_set<int> st;
for (int i : nums) st.insert(i);
for (int i = 0; i < N; ++ i) {
sz[i] = 1;
}
for (int i = 1; i <= primes[0]; ++ i) {
long long x = primes[i];
if (!st.count(x)) sz[x] --;
for (long long j = 1; j <= N / x; ++ j) {
long long t = (long long)j * x;
if (st.count(t)) {
un(x, t);
}
}
}
return ret;
}
};
285 场单周
第一题
class Solution {
public:
int countHillValley(vector<int>& nums) {
int ret = 0;
for (int i = 1; i < nums.size() - 1; ++ i) {
int j = i - 1, k = i + 1;
// while (j > 0 && nums[j] == nums[i]) -- j;
while (k < nums.size() - 1 && nums[i] == nums[k]) ++ k;
if (nums[j] < nums[i] && nums[k] < nums[i]) {
++ ret;
// cout << i << " f" << endl;
}
else if (nums[j] > nums[i] && nums[k] > nums[i]) {
// cout << i << " g" << endl;
++ ret;
}
}
return ret;
}
};
第二题
class Solution {
public:
int countCollisions(string ds) {
stack<char> st;
int f = 0;
int ret = 0;
for (int i = 0; i < ds.size(); ++ i) {
if (ds[i] == 'R') st.push('R');
else if (ds[i] == 'L') {
if (st.size()) ret += st.size();
else ret += f;
if (st.size() && st.top() == 'R') ++ ret;
while (st.size()) st.pop();
if (ret) f = 1;
}
else if (ds[i] == 'S') {
ret += st.size();
while (st.size()) st.pop();
f = 1;
}
// cout << "i " << i << " " << ret << endl;
}
return ret;
}
};
第三题
class Solution {
public:
vector<int> maximumBobPoints(int ns, vector<int>& as) {
int mask = 0, f = 0;
int ret = 0, rm = 0;
for (mask = 0; mask < (1 << 12); ++ mask) {
int tot = 0, se = 0;
for (int j = 0; j < 12; ++ j) {
if (mask >> j & 1) {
tot += as[j] + 1;
se += j;
}
if (tot <= ns) {
if (se > ret) {
ret = se;
rm = mask;
}
}
else break;
}
}
vector<int> rt(12, 0);
int tot = 0;
for (int j = 0; j < 12; ++ j) {
if (rm >> j & 1) {
rt[j] = as[j] + 1;
tot += rt[j];
}
}
if (ns > tot) rt[0] = ns - tot;
return rt;
}
};
第四题
补题中...
74 场双周
第一题
class Solution {
public:
bool divideArray(vector<int>& nums) {
int cnt[505];
memset(cnt, 0, sizeof cnt);
for (int& i : nums) cnt[i] ++;
for (int i = 1; i < 505; ++ i) {
if (cnt[i] % 2) return false;
}
return true;
}
};
第二题
class Solution {
public:
long long maximumSubsequenceCount(string tx, string p) {
int cnta = 0, cntc = 0;
for (char c : tx) {
if (c == p[0]) ++ cnta;
else if (c == p[1]) ++ cntc;
}
if (cnta > cntc) tx += p[1];
else {
string tt;
tt += p[0];
tt += tx;
tx = tt;
}
int cnt[100005];
memset(cnt, 0, sizeof cnt);
for (int i = tx.size() - 1; i >= 0; -- i) {
cnt[i] = cnt[i + 1];
if (tx[i] == p[1]) cnt[i] ++;
}
long long ret = 0;
for (int i = 0; i < tx.size(); ++ i) {
if (tx[i] == p[0]) {
ret += cnt[i + 1];
}
}
return ret;
}
};
第三题
class Solution {
public:
int halveArray(vector<int>& nums) {
int ret = 0;
priority_queue<double, vector<double>, less<double> > q;
for (int& i : nums) q.push(i);
double sum = 0;
for (int i = 0; i < nums.size(); ++ i) sum += (double)nums[i] / 2;
double t = 0;
int cnt = 0;
while (t < sum) {
t += q.top() / 2;
double tt = q.top();
q.pop();
q.push(tt / 2);
++ cnt;
}
return cnt;
}
};
第四题
class Solution {
public:
int minimumWhiteTiles(string f, int n, int c) {
vector<vector<int> > dp(f.size() + 1, vector<int>(n + 1, 1e8));
for (int i = 0; i <= n; ++ i) dp[0][i] = 0;
for (int i = 1; i <= f.size(); ++ i) {
for (int j = 0; j <= n; ++ j) {
dp[i][j] = dp[i - 1][j] + (f[i - 1] == '1');
if (j) dp[i][j] = min(dp[i][j], dp[max(i - c, 0)][j - 1]);
}
}
return dp[f.size()][n];
}
};
153 场
第一题
class Solution {
public:
int distanceBetweenBusStops(vector<int>& dt, int st, int dn) {
if (st > dn) swap(st, dn);
int k = dn - st;
int n = dt.size();
for (int i = 0; i < n; ++ i) dt.push_back(dt[i]);
int t = 0;
int ret;
for (int i = st; i < dn; ++ i) {
t += dt[i];
}
ret = t;
t = 0;
for (int i = dn; i < st + n; ++ i) {
t += dt[i];
}
// cout << ret << " " << t << endl;
ret = min(ret, t);
return ret;
}
};
第二题
class Solution {
public:
string dayOfTheWeek(int day, int month, int year) {
vector<string> week = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
vector<int> monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
/* 输入年份之前的年份的天数贡献 */
int days = 365 * (year - 1971) + (year - 1969) / 4;
/* 输入年份中,输入月份之前的月份的天数贡献 */
for (int i = 0; i < month - 1; ++i) {
days += monthDays[i];
}
if ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && month >= 3) {
days += 1;
}
/* 输入月份中的天数贡献 */
days += day;
return week[(days + 3) % 7];
}
};
第三题
class Solution {
public:
int maximumSum(vector<int>& arr) {
vector<vector<int> > dp(arr.size() + 1, vector<int>(2));
dp[0][0] = -1e8;
for (int i = 1; i <= arr.size(); ++ i) {
dp[i][0] = max(dp[i - 1][0] + arr[i - 1], arr[i - 1]);
dp[i][1] = max(dp[i - 1][0], dp[i - 1][1] + arr[i - 1]);
}
int ret = -1e8;
for (int i = 1; i <= arr.size(); ++ i) {
ret = max(ret, max(dp[i][0], dp[i][1]));
}
return ret;
}
};
第四题
补题中...
249 场
第一题
class Solution {
public:
vector<int> getConcatenation(vector<int>& nums) {
vector<int> ans;
for (int i = 0; i < nums.size(); ++ i) ans.push_back(nums[i]);
for (int i = 0; i < nums.size(); ++ i) ans.push_back(nums[i]);
return ans;
}
};
第二题
class Solution {
public:
int countPalindromicSubsequence(string s) {
int ret = 0;
for (int i = 0; i < 26; ++ i) {
char c = 'a' + i;
int mx = 0;
unordered_set<char> ct;
int j;
for (j = 0; j < s.size(); ++ j) {
if (s[j] == c) break;
}
if (j + 1 < s.size()) ct.insert(s[++ j]);
++ j;
while (j < s.size() ) {
if (s[j] == c) {
mx = ct.size();
}
ct.insert(s[j]);
++ j;
}
ret += mx;
}
return ret;
}
};
第三题
补题中...
第四题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int d[200005];
TreeNode* q[200005];
void dfs(TreeNode* head, vector<int>& vt) {
if (head->left) dfs(head->left, vt);
vt.push_back(head->val);
if (head->right) dfs(head->right, vt);
}
TreeNode* canMerge(vector<TreeNode*>& trees) {
memset(d, 0, sizeof d);
unordered_map<int, TreeNode* > mp;
for (TreeNode* it : trees) {
mp[it->val] = it;
if (it->left)
{
++ d[it->left->val];
if (d[it->left->val] >= 2) return NULL;
}
if (it->right) {
++ d[it->right->val];
if (d[it->right->val] >= 2) return NULL;
}
}
int hh = 0, tt = -1;
TreeNode* head;
for (TreeNode* it : trees) {
if (d[it->val] == 0) {
q[++ tt] = it;
head = it;
break;
}
}
int cnt = 1;
unordered_set<TreeNode*> st;
while (hh <= tt) {
TreeNode* t = q[hh ++];
if (t->left) {
if (mp[t->left->val]) {
t->left = mp[t->left->val];
q[++ tt] = t->left;
++ cnt;
if (st.count(t->left)) return NULL;
st.insert(t->left);
}
}
if (t->right) {
if (mp[t->right->val]) {
t->right = mp[t->right->val];
q[++ tt] = t->right;
++ cnt;
if (st.count(t->right)) return NULL;
st.insert(t->right);
}
}
}
if (cnt != trees.size()) return NULL;
vector<int> vt;
dfs(head, vt);
if (is_sorted(vt.begin(), vt.end())) return head;
return NULL;
}
};
208 场
第一题
class Solution {
public:
int minOperations(vector<string>& logs) {
int cnt = 0;
for (string& s : logs) {
if (s[0] == '.' && s[1] == '.') {
if (cnt) -- cnt;
}
else if (s[0] == '.' && s[1] == '/');
else ++ cnt;
}
return cnt;
}
};
第二题
class Solution {
public:
int minOperationsMaxProfit(vector<int>& cs, int bt, int rt) {
long long ret = 0, rcnt = -1;
long long cnt = 0, res = 4, sum = 0;
for (int i = 0; i < cs.size(); ++ i) {
int f = 0;
int t = cs[i];
while (cnt < i) {
f = 1;
++ cnt;
res = 4;
}
while (t >= res) {
t -= res;
sum += res;
res = 4;
++ cnt;
f = 1;
}
if (f && (long long)sum * bt - (long long)cnt * rt > ret) {
ret = sum * bt - cnt * rt;
rcnt = cnt;
}
res -= t;
sum += t;
}
++ cnt;
if ((long long)sum * bt - (long long)cnt * rt > ret) {
ret = sum * bt - cnt * rt;
rcnt = cnt;
}
return rcnt;
}
};
第三题
class ThroneInheritance {
public:
unordered_map<string, vector<string> > mp;
unordered_set<string> dth;
string king;
ThroneInheritance(string kingName) {
king = kingName;
}
void birth(string parentName, string childName) {
mp[parentName].push_back(childName);
}
void death(string name) {
dth.insert(name);
}
void dfs(vector<string>&ret, string u) {
for (string& s : mp[u]) {
if (!dth.count(s)) ret.push_back(s);
dfs(ret, s);
}
}
vector<string> getInheritanceOrder() {
vector<string> ret;
if (!dth.count(king)) ret.push_back(king);
dfs(ret, king);
return ret;
}
};
/**
* Your ThroneInheritance object will be instantiated and called as such:
* ThroneInheritance* obj = new ThroneInheritance(kingName);
* obj->birth(parentName,childName);
* obj->death(name);
* vector<string> param_3 = obj->getInheritanceOrder();
*/
第四题
#define INF 1e8
class Solution {
public:
static const int N = 50, M = 60;
int h[N], e[M], f[M], w[M], ne[M], idx;
int q[N], d[N], pre[N], incf[N]; // d 记录权值, pre 记录来边, incf 记录到某地最大流量
int S, T;
bool st[N];
void add(int a, int b, int c, int ct) {
e[idx] = b, w[idx] = ct, f[idx] = c, ne[idx] = h[a], h[a] = idx ++;
e[idx] = a, w[idx] = -ct, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++;
}
bool spfa()
{
int hh = 0, tt = 1;
memset(d, 0x3f, sizeof d);
memset(incf, 0, sizeof incf);
q[0] = S, d[S] = 0, incf[S] = INF;
while (hh != tt)
{
int t = q[hh ++ ];
if (hh == N) hh = 0;
st[t] = false;
for (int i = h[t]; ~i; i = ne[i])
{
int ver = e[i];
if (f[i] && d[ver] > d[t] + w[i])
{
d[ver] = d[t] + w[i];
pre[ver] = i;
incf[ver] = min(f[i], incf[t]);
if (!st[ver])
{
q[tt ++ ] = ver;
if (tt == N) tt = 0;
st[ver] = true;
}
}
}
}
return incf[T] > 0;
}
void EK(int& flow, int& cost)
{
flow = cost = 0;
while (spfa())
{
int t = incf[T];
flow += t, cost += t * d[T];
for (int i = T; i != S; i = e[pre[i] ^ 1])
{
f[pre[i]] -= t;
f[pre[i] ^ 1] += t;
}
}
}
int maximumRequests(int n, vector<vector<int>>& requests) {
vector<int> deg(n);
memset(h, -1, sizeof h);
for (auto& it : requests) {
add(it[0] + 1, it[1] + 1, 1, 1);
deg[it[0]] --;
deg[it[1]] ++;
}
S = N - 1, T = N - 2;
for (int i = 0; i < n; ++ i) {
if (deg[i] > 0) {
add(i + 1, T, deg[i], 0);
}else if (deg[i] < 0) {
add(S, i + 1, -deg[i], 0);
}
}
int flow, ret;
EK(flow, ret);
return requests.size() - ret;
}
};
141 场
第一题
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
vector<int> ret;
for (int i = 0; i < arr.size(); ++ i) {
if (ret.size() >= arr.size()) break;
ret.push_back(arr[i]);
if (ret.size() >= arr.size()) break;
if (arr[i] == 0) ret.push_back(0);
}
arr = ret;
}
};
第二题
class Solution {
public:
int largestValsFromLabels(vector<int>& vs, vector<int>& ls, int nd, int ut) {
vector<pair<int, int> > tt;
for (int i = 0; i < vs.size(); ++ i) {
tt.push_back({vs[i], ls[i]});
}
sort(tt.begin(), tt.end(), [](pair<int, int>& a, pair<int, int>&b){
return a.first > b.first;
});
unordered_map<int, int> mp;
int ret = 0, cnt = 0;
for (auto& it : tt) {
if (cnt < nd) {
if (mp[it.second] < ut) {
++ mp[it.second];
++ cnt;
ret += it.first;
}
}else break;
}
return ret;
}
};
第三题
class Solution {
public:
int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};
pair<int, int> q[10005];
int shortestPathBinaryMatrix(vector<vector<int>>& gd) {
int hh = 0, tt = -1;
if (gd[0][0] != 0) return -1;
if (gd.size() == 1 && gd[0].size() == 1) return 1;
q[++ tt] = {0, 0};
int ret = 1;
while (hh <= tt) {
int sz = tt - hh + 1;
++ ret;
for (int i = 0; i < sz; ++ i) {
int x = q[hh].first;
int y = q[hh ++].second;
for (int k = 0; k < 8; ++ k) {
int xt = x + dx[k];
int yt = y + dy[k];
if (xt < 0 || xt >= gd.size() || yt < 0 || yt >= gd[0].size() || gd[xt][yt]) continue;
gd[xt][yt] = 1;
q[++ tt] = {xt, yt};
if (xt == gd.size() - 1 && yt == gd[0].size() - 1) return ret;
}
}
}
return -1;
}
};
第四题
class Solution {
public:
string shortestCommonSupersequence(string s1, string s2) {
int n = s1.size();
int m = s2.size();
vector<vector<string> > dp(n + 1, vector<string>(m + 1));
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= m; ++ j) {
if (s1[i - 1] == s2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + s1[i - 1];
}
else {
int t = 0, d = dp[i - 1][j - 1].size();
if (dp[i][j - 1].size() > d) {
t = 1;
d =dp[i][j - 1].size();
}
if (dp[i - 1][j].size() > d) {
t = 2;
d = dp[i - 1][j].size();
}
if (t == 0) dp[i][j] = dp[i - 1][j - 1];
else if (t == 1) dp[i][j] = dp[i][j - 1];
else if (t == 2) dp[i][j] = dp[i - 1][j];
}
}
}
string ret;
string t = dp[n][m];
int i, j, k;
for (i = 0, j = 0, k = 0; k < t.size(); ++ i, ++ j, ++ k) {
while (i < n && s1[i] != t[k]) {
ret += s1[i];
++ i;
}
while (j < m && s2[j] != t[k]) {
ret += s2[j];
++ j;
}
ret += t[k];
}
while (i < n) {
ret += s1[i ++];
}
while (j < m) {
ret += s2[j ++];
}
return ret;
}
};
238 场
第一题
class Solution {
public:
int sumBase(int n, int k) {
int ret = 0;
while (n) {
ret += n % k;
n /= k;
}
return ret;
}
};
第二题
class Solution {
public:
int maxFrequency(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int ret = 0;
long long sum = 0;
for (int i = 0, j = 0; j < nums.size(); ++ j) {
sum += nums[j];
int t = j - i + 1;
while (i < j && (long long)sum + k < (long long)t * nums[j]) {
sum -= nums[i];
++ i;
-- t;
}
ret = max(ret, t);
}
return ret;
}
};
第三题
class Solution {
public:
string t = "aeiou";
int longestBeautifulSubstring(string word) {
int ret = 0;
stack<char> stk;
unordered_map<char, int> mp;
for (int i = 0; i < t.size(); ++ i) {
mp[t[i]] = i;
}
// int f = 0;
for (int i = 0; i < word.size(); ++ i) {
if (stk.size() && (mp[word[i]] < mp[stk.top()] || mp[word[i]] > mp[stk.top()] + 1)) {
while (stk.size()) stk.pop();
if (word[i] == 'a') stk.push(word[i]);
}
else if (stk.size()) stk.push(word[i]);
else if (word[i] == 'a') stk.push(word[i]);
if (stk.size() && stk.top() == 'u') ret = max(ret, (int)stk.size());
}
return ret;
}
};
第四题
补题中...
217 场
第一题
class Solution {
public:
int maximumWealth(vector<vector<int>>& as) {
int ret = 0;
for (auto& it : as) {
int t = 0;
for (int& x : it) {
t += x;
}
ret = max(ret, t);
}
return ret;
}
};
第二题
class Solution {
public:
vector<int> mostCompetitive(vector<int>& nums, int k) {
int n = nums.size();
vector<int> ret;
for (int i = 0; i < nums.size(); ++ i) {
for (int j = ret.size() - 1; j >= 0; -- j) {
if (ret[j] > nums[i] && i + k - j - 1 < n) {
ret.pop_back();
}else break;
}
if (ret.size() < k)
ret.push_back(nums[i]);
}
return ret;
}
};
第三题
class Solution {
public:
int minMoves(vector<int>& nums, int limit) {
// 差分数组, diff[0...x] 的和表示最终互补的数字和为 x,需要的操作数
// 因为差分数组的计算需要更新 r + 1,所以数组的总大小在 limit * 2 + 1 的基础上再 + 1
vector<int> diff(limit * 2 + 2, 0);
int n = nums.size();
for(int i = 0; i < n / 2; i ++){
int A = nums[i], B = nums[n - 1 - i];
// [2, 2 * limit] 范围 + 2
int l = 2, r = 2 * limit;
diff[l] += 2, diff[r + 1] -= 2;
// [1 + min(A, B), limit + max(A, B)] 范围 -1
l = 1 + min(A, B), r = limit + max(A, B);
diff[l] += -1, diff[r + 1] -= -1;
// [A + B] 再 -1
l = A + B, r = A + B;
diff[l] += -1, diff[r + 1] -= -1;
}
// 依次求和,得到 最终互补的数字和 i 的时候,需要的操作数 sum
// 取最小值
int res = n, sum = 0;
for(int i = 2; i <= 2 * limit; i ++){
sum += diff[i];
if(sum < res) res = sum;
}
return res;
}
};
作者:liuyubobobo
[链接:](https://leetcode-cn.com/problems/minimum-moves-to-make-array-complementary/solution/jie-zhe-ge-wen-ti-xue-xi-yi-xia-chai-fen-shu-zu-on/)
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
第四题
class Solution {
public:
int minimumDeviation(vector<int>& nums) {
int p_max = 1;
for(int a : nums) p_max = max(p_max, a >> (__builtin_ctz(a)));
vector<int> upper;
int min = p_max;
for(int a : nums){
if(a & 1) a <<= 1;
if(a >= p_max){
a >>= __builtin_clz(p_max) - __builtin_clz(a);
if(a < p_max) a <<= 1;
upper.push_back(a);
}
min = std::min(min, a);
}
sort(upper.begin(), upper.end());
int ans = upper.back() - min;
for(int i = upper.size() - 1; upper[i] > p_max; i -= 1){
min = std::min(min, upper[i] >> 1);
ans = std::min(ans, upper[i - 1] - min);
}
return ans;
}
};
244 场
第一题
class Solution {
public:
bool findRotation(vector<vector<int>>& mt, vector<vector<int>>& target) {
int n = mt.size();
int m = mt[0].size();
vector<vector<int> > ret(n, vector<int>(m));
for (int i = 0; i < 4; ++ i) {
for (int j = 0; j < n; ++ j) {
for (int k = 0, tk = n - 1; k < m; ++ k, -- tk) {
ret[j][k] = mt[tk][j];
}
}
if (ret == target) return true;
mt = ret;
}
return false;
}
};
第二题
class Solution {
public:
int reductionOperations(vector<int>& nums) {
sort(nums.begin(), nums.end());
int t = 0;
int ret = 0;
for (int i = 1; i < nums.size(); ++ i) {
if (nums[i] == nums[i - 1]) ret += t;
else ret += ++ t;
}
return ret;
}
};
第三题
class Solution {
public:
int minFlips(string s) {
int n = s.size();
vector<vector<int> > l(2, vector<int>(n));
vector<vector<int> > r(2, vector<int>(n));
for (int i = 0; i < 2; ++ i) {
for (int j = 0, c = 0, k = i; j < n; ++ j, k ^= 1) {
if (k != s[j] - '0') ++ c;
l[i][j] = c;
}
}
for (int i = 0; i < 2; ++ i) {
for (int j = n - 1, c = 0, k = i; j >= 0; -- j, k ^= 1) {
if (k != s[j] - '0') ++ c;
r[i][j] = c;
}
}
if (n % 2 == 0) {
return min(l[0][n - 1], l[1][n - 1]);
}else {
int ret = min(l[0][n - 1], l[1][n - 1]);
for (int i = 0; i + 1 < n; ++ i) {
ret = min(ret, l[0][i] + r[1][i + 1]);
ret = min(ret, l[1][i] + r[0][i + 1]);
}
return ret;
}
}
};
第四题
class Solution {
public:
int minWastedSpace(vector<int>& ps, vector<vector<int>>& bs) {
sort(ps.begin(), ps.end());
long long sum = 0;
for (int& x : ps) sum += x;
long long ret = 1e18;
for (auto& it : bs) {
sort(it.begin(), it.end());
if (ps.back() > it.back()) continue;
long long t = -sum, last = -1;
for (auto& x : it) {
int l = last, r = ps.size() - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (ps[mid] > x) r = mid - 1;
else l = mid;
}
if (r == last) continue;
t += (r - last) * x;
last = r;
}
ret = min(ret, t);
}
if (ret == 1e18) return -1;
int mod = 1e9 + 7;
return ret % mod;
}
};
146 场
第一题
class Solution {
public:
static const int N = 4E4 + 5;
int get(int v) {
return v * (1 + v) / 2;
}
int numEquivDominoPairs(vector<vector<int>>& ds) {
unordered_map<int, int> mp;
for (auto& it : ds) {
if (it[0] < it[1]) swap(it[0], it[1]);
mp[it[0] * N + it[1]] ++;
}
int ret = 0;
for (auto [c, v] : mp) {
if (v > 1)
ret += get(v - 1);
}
return ret;
}
};
第二题
补题ing...
第三题
class Solution {
public:
int mctFromLeafValues(vector<int>& arr) {
int n = arr.size();
vector<vector<int> > dp(arr.size(), vector<int>(arr.size(), 1e9));
vector<vector<int> > mx(n, vector<int>(n));
for (int i = 0; i < n; ++ i) {
int x = 0;
for (int j = i; j < n; ++ j) {
x = max(arr[j], x);
mx[i][j] = x;
}
}
for (int len = 1; len <= n; ++ len) {
for (int i = 0; i + len - 1 < n; ++ i) {
int j = i + len - 1;
if (i == j) {
dp[i][i] = 0;
}else {
for (int k = i; k < j; ++ k) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + mx[i][k] * mx[k + 1][j]);
}
}
}
}
return dp[0][n - 1];
}
};
第四题
补题ing...
194 场
第一题
class Solution {
public:
int xorOperation(int n, int start) {
int ret = 0;
while (n --) {
ret ^= start;
start += 2;
}
return ret;
}
};
第二题
class Solution {
public:
vector<string> getFolderNames(vector<string>& names) {
unordered_map<string, int> mp;
unordered_set<string> st;
vector<string> ret;
for (string s : names) {
if (st.count(s)) {
string t = s;
while (st.count(t)) {
t = s;
int& k = mp[s];
t += "(" + to_string(k + 1) + ")";
++ k;
}
s = t;
}
ret.push_back(s);
st.insert(s);
}
return ret;
}
};
第三题
vector<int> avoidFlood(vector<int>& rains) {
vector<int> ans(rains.size(), 1);
unordered_map<int, int> water;
set<int> zero;
for (int i = 0; i < rains.size(); i++) {
int r = rains[i];
if (r == 0) {
zero.insert(i);
continue;
}
if (water.count(r) != 0) {
auto it = zero.lower_bound(water[r]);
if (it == zero.end()) return {};
ans[*it] = r;
zero.erase(it);
}
water[r] = i;
ans[i] = -1;
}
return ans;
}
第四题
class Solution {
public:
static const int N = 105;
int fa[N];
int find(int x) {
return fa[x] == -1 ? x : find(fa[x]);
}
vector<vector<int>> findCriticalAndPseudoCriticalEdges(int n, vector<vector<int>>& es) {
vector<vector<int> > ret(2);
for (int i = 0; i < es.size(); ++ i) {
es[i].push_back(i);
}
sort(es.begin(), es.end(), [](vector<int>& a, vector<int>& b) {
return a[2] < b[2];
});
memset(fa, -1, sizeof fa);
int k = 0;
for (int i = 0; i < es.size(); ++ i) {
int a = es[i][0], b = es[i][1], c = es[i][2];
a = find(a);
b = find(b);
if (a != b) {
fa[a] = b;
k += c;
}
}
// cout << k << endl;
for (int j = 0; j < es.size(); ++ j) {
memset(fa, -1, sizeof fa);
int t = 0;
int at, bt, ct;
for (int i = 0; i < es.size(); ++ i) {
int a = es[i][0], b = es[i][1], c = es[i][2], id = es[i][3];
if (id == j) {
at = a, bt = b, ct = c;
continue;
}
a = find(a);
b = find(b);
if (a != b) {
fa[a] = b;
t += c;
}
}
int f = 1;
for (int i = 1; i < n; ++ i) {
if (find(i - 1) != find(i)) {
f = 0;
break;
}
}
if (f == 0 || t > k) {
ret[0].push_back(j);
continue;
}
memset(fa, -1, sizeof fa);
t = 0;
fa[find(at)] = find(bt);
t += ct;
for (int i = 0; i < es.size(); ++ i) {
int a = es[i][0], b = es[i][1], c = es[i][2], id = es[i][3];
if (id == j) {
continue;
}
a = find(a);
b = find(b);
if (a != b) {
fa[a] = b;
t += c;
}
}
if (t == k) ret[1].push_back(j);
}
return ret;
}
};
284 场
第一题
class Solution {
public:
vector<int> findKDistantIndices(vector<int>& nums, int key, int k) {
vector<int> ret;
vector<int> j;
for (int i = 0; i < nums.size(); ++ i) {
if (nums[i] == key) {
j.push_back(i);
}
}
for (int& x : j) {
for (int i = max(0, x - k); i < min((int)nums.size(), x + k + 1); ++ i) {
ret.push_back(i);
}
}
sort(ret.begin(), ret.end());
ret.erase(unique(ret.begin(), ret.end()), ret.end());
return ret;
}
};
第二题
class Solution {
public:
int t;
int get(int x, int y) {
return x * t + y;
}
int digArtifacts(int n, vector<vector<int>>& as, vector<vector<int>>& dig) {
t = n;
unordered_set<int> st;
for (auto& it : dig) {
st.insert(get(it[0], it[1]));
}
int ret = 0;
for (auto& it : as) {
int f = 1;
for (int i = it[0]; i <= it[2]; ++ i) {
for (int j = it[1]; j <= it[3]; ++ j) {
if (!st.count(get(i, j))) {
f = 0;
break;
}
}
}
if (f) ++ ret;
}
return ret;
}
};
第三题
class Solution {
public:
int maximumTop(vector<int>& nums, int k) {
if (nums.size() == 1 && k % 2 == 1) return -1;
int ret = 0;
for (int i = 0; i < min((int)nums.size(), k + 1); ++ i) {
if (i != k - 1)
ret = max(ret, nums[i]);
}
return ret;
}
};
第四题
class Solution {
public:
static const int N = 2e5 + 5;
typedef pair<long long, int> PLI;
int n; // 点的数量
int h1[N], h2[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边
long long d1[N], d2[N], d3[N]; // 存储所有点到1号点的距离
bool st[N]; // 存储每个点的最短距离是否已确定
// 求1号点到n号点的最短距离,如果不存在,则返回-1
void dijkstra(long long dist[N], int a, int h[N])
{
memset(st, false, sizeof st);
for (int i = 0; i < N; ++ i) dist[i] = 1e18;
dist[a] = 0;
priority_queue<PLI, vector<PLI>, greater<PLI>> heap;
heap.push({0, a}); // first存储距离,second存储节点编号
while (heap.size())
{
auto t = heap.top();
heap.pop();
int ver = t.second;
long long distance = t.first;
if (st[ver]) continue;
st[ver] = true;
for (int i = h[ver]; i != -1; i = ne[i])
{
int j = e[i];
if (dist[j] > distance + w[i])
{
dist[j] = distance + w[i];
heap.push({dist[j], j});
}
}
}
}
void add(int h[N], int a, int b, int c) {
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}
long long minimumWeight(int n, vector<vector<int>>& es, int s1, int s2, int dt) {
this->n = n;
memset(h1, -1, sizeof h1);
memset(h2, -1, sizeof h2);
for (auto& it : es) {
add(h1, it[0], it[1], it[2]);
add(h2, it[1], it[0], it[2]);
}
dijkstra(d1, s1, h1);
dijkstra(d2, s2, h1);
dijkstra(d3, dt, h2);
long long ans = 1e18;
for (int i = 0; i < n; i++) if (d1[i] >= 0 && d2[i] >= 0 && d3[i] >= 0) ans = min(ans, d1[i] + d2[i] + d3[i]);
return ans < 1e18 ? ans : -1;
}
};
225 场
第一题
class Solution {
public:
string maximumTime(string time) {
string ret;
string h, m;
if (time[0] == '?' && ((time[1] <= '3' && time[1] >= '0') || time[1] == '?')) ret += '2';
else if (time[0] == '?') {
ret += '1';
}else ret += time[0];
if (time[1] == '?' ) {
if (ret[0] != '2') ret += '9';
else ret += '3';
}else ret += time[1];
ret += ':';
if (time[3] == '?') ret += '5';
else ret += time[3];
if (time[4] == '?') ret += '9';
else ret += time[4];
return ret;
}
};
第二题
class Solution {
public:
int minCharacters(string a, string b) {
vector<int> acnt(26, 0);
vector<int> bcnt(26, 0);
int an = a.size(), bn = b.size();
for (char c : a) acnt[c-'a']++;
for (char c : b) bcnt[c-'a']++;
int ans = INT_MAX, asum = 0, bsum = 0;
for (int i = 0; i < 25; i++) {
asum += acnt[i];
bsum += bcnt[i];
ans = min(min(ans, an-acnt[i]+bn-bcnt[i]), min(an-asum+bsum, bn-bsum+asum));
}
ans = min(ans, an-acnt[25]+bn-bcnt[25]);
return ans;
}
};
第三题
class Solution {
public:
int kthLargestValue(vector<vector<int>>& mx, int k) {
int n = mx.size();
int m = mx[0].size();
vector<int> ret;
vector<vector<int> > pre(n + 1, vector<int>(m + 1));
for (int j = 0; j <= m; ++ j) {
pre[0].push_back(0);
}
for (int i = 0; i <= n; ++ i) {
pre[i][0] = 0;
}
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= m; ++ j) {
pre[i][j] = mx[i - 1][j - 1] ^ pre[i - 1][j] ^ pre[i][j - 1] ^ pre[i - 1][j - 1];
ret.push_back(pre[i][j]);
}
}
sort(ret.begin(), ret.end());
// for (int i = 1; i <= n; ++ i) {
// for (int j = 1; j <= m; ++ j) {
// cout << pre[i][j] << " ";
// }
// cout << endl;
// }
// for (int& i : ret) cout << i << endl;
return ret[ret.size() - k];
}
};
第四题
class Solution {
public:
long long get(int x) {
return (long long)(1 + x) * x / 2;
}
bool check(int mid, int n) {
long long tot = 0;
for (int i = 1; i <= mid; ++ i) {
tot += get(i);
if (tot >= n) return true;
}
return false;
}
int minimumBoxes(int n) {
int l = 1, r = 2000;
while (l < r) {
int mid = l + r >> 1;
if (check(mid, n)) r = mid;
else l = mid + 1;
}
// for (int i = 1; i < l; ++ i) {
// n -= get(i);
// }
n -= l == 1? (long long)l * (l + 1) / 6 : (long long)(l - 1) * l * (l + 1) / 6;
int ret = get(l - 1);
for (int i = 0; ; ++ i) {
++ ret;
-- n;
n -= i;
if (n <= 0) break;
}
return ret;
}
};
261 场
第一题
class Solution {
public:
int minimumMoves(string s) {
int ret = 0;
for (int i = 0; i < s.size(); ++ i) {
if (s[i] == 'X') {
++ ret;
for (int k = 0; k < 3 && i + k < s.size(); ++ k) {
s[i + k] = 'O';
}
}
}
return ret;
}
};
第二题
class Solution {
public:
vector<int> missingRolls(vector<int>& rolls, int mean, int n) {
int m = rolls.size();
int tot = (n + m) * mean;
for (int& i : rolls) {
tot -= i;
}
if (tot > n * 6 || tot < n) return {};
vector<int> ret(n, 1);
tot -= n;
for (int i = 0; i < ret.size(); ++ i) {
if (tot >= 5) {
ret[i] += 5;
tot -= 5;
}
else {
if (tot == 0) break;
ret[i] += tot;
tot = 0;
}
}
return ret;
}
};
第三题
class Solution {
public:
bool stoneGameIX(vector<int>& stones) {
int cnt0 = 0, cnt1 = 0, cnt2 = 0;
for (int val: stones) {
if (int type = val % 3; type == 0) {
++cnt0;
}
else if (type == 1) {
++cnt1;
}
else {
++cnt2;
}
}
if (cnt0 % 2 == 0) {
return cnt1 >= 1 && cnt2 >= 1;
}
return cnt1 - cnt2 > 2 || cnt2 - cnt1 > 2;
}
};
第四题
补题ing...
118 场
第一题
class Solution {
public:
vector<int> powerfulIntegers(int x, int y, int bd) {
vector<int> ret;
for (int i = 0; ; ++ i) {
int n1 = pow(x, i);
if (n1 > bd) break;
for (int j = 0; ; ++ j) {
int n2 = pow(y, j);
long long z = (long long) n1 + n2;
if (z > bd) break;
ret.push_back(z);
if (y == 1) break;
}
if (x == 1) break;
}
sort(ret.begin(), ret.end());
ret.erase(unique(ret.begin(), ret.end()), ret.end());
return ret;
}
};
第二题
class Solution {
public:
vector<int> pancakeSort(vector<int>& arr) {
int rt = 0;
vector<int> ret;
while (rt < arr.size()) {
int last = 0;
for (int i = 0; i < arr.size() - rt; ++ i) {
if (arr[i] >= arr[last]) {
last = i;
}
}
ret.push_back(last + 1);
ret.push_back(arr.size() - rt);
reverse(arr.begin(), arr.begin() + last + 1);
reverse(arr.begin(), arr.end() - rt);
++ rt;
}
return ret;
}
};
第三题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int fa[105];
int son[105][1];
void dfs(TreeNode* u, int f) {
int val = u->val;
fa[val] = f;
if (u->left) dfs(u->left, val);
if (u->right) {
dfs(u->right, val);
son[val][0] = u->right->val;
}
}
vector<int> flipMatchVoyage(TreeNode* root, vector<int>& ve) {
dfs(root, 0);
stack<pair<int, int> > stk;
stk.push({0, 0});
vector<int> ret;
for (int i = 0; i < ve.size(); ++ i ) {
while (stk.size() && fa[ve[i]] != stk.top().first) {
stk.pop();
}
if (stk.size() == 0) return {-1};
stk.top().second ++;
if (stk.top().second == 2 && son[stk.top().first][0] != ve[i] && stk.top().first != 0) {
ret.push_back(stk.top().first);
}
stk.push({ve[i], 0});
}
return ret;
}
};
第四题
class Solution {
public:
bool isRationalEqual(string s, string t) {
string t1, t2;
string s1, s2;
int s1h = 0, s2h = 0;
for (int i = 0; i < s.size(); ++ i) {
if (s[i] == '(') {
++ i;
while (s[i] != ')') {
t1 += s[i ++];
}
++ i;
break;
}
if (s[i] == '.') s1h = 1;
s1 += s[i];
}
for (int i = 0; i < t.size(); ++ i) {
if (t[i] == '(') {
++ i;
while (t[i] != ')') {
t2 += t[i ++];
}
++ i;
break;
}
if (t[i] == '.') s2h = 1;
s2 += t[i];
}
// cout << "s1: " << s1 << " " << "t1: " << t1 << endl;
// cout << "s2: " << s2 << " " << "t2: " << t2 << endl;
int f1 = 1, f2 = 1;
for (int i = 0; i < t1.size(); ++ i) {
if (t1[i] != '9') {
f1 = 0;
break;
}
}
if (t1.size() == 0) f1 = 0;
for (int i = 0; i < t2.size(); ++ i) {
if (t2[i] != '9') {
f2 = 0;
break;
}
}
if (t2.size() == 0) f2 = 0;
if (f2 == 0 && t2.size() > t1.size()) {
s2 += t2 + t2 + t2;
while (t1 != "" && f1 == 0 && !(t1.size() == 1 && t1[0] == '0') &&s1.size() < s2.size()) {
s1 += t1;
}
}else if (f1 == 0) {
s1 += t1 + t1 + t1;
while (t2 != "" && f2 == 0 && !(t2.size() == 1 && t2[0] == '0' )&& s2.size() < s1.size()) {
s2 += t2;
}
}
// cout << "s1: " << s1 << " " << "t1: " << t1 << endl;
// cout << "s2: " << s2 << " " << "t2: " << t2 << endl;
if (f1) {
int k = 1;
for (int i = s1.size() - 1; i >= 0; -- i) {
if (s1[i] == '.') continue;
int x = s1[i] - '0';
x += k;
k = 0;
if (x >= 10) {
k = 1;
x %= 10;
}
s1[i] = (char) '0' + x;
}
if (k) {
reverse(s1.begin(), s1.end());
s1 += "1";
reverse(s1.begin(), s1.end());
}
}
if (f2) {
int k = 1;
for (int i = s2.size() - 1; i >= 0; -- i) {
if (s2[i] == '.') continue;
int x = s2[i] - '0';
x += k;
k = 0;
if (x >= 10) {
k = 1;
x %= 10;
}
s2[i] = (char)'0' + x;
}
if (k) {
reverse(s2.begin(), s2.end());
s2 += "1";
reverse(s2.begin(), s2.end());
}
}
// cout << "s1: " << s1 << " " << "t1: " << t1 << endl;
// cout << "s2: " << s2 << " " << "t2: " << t2 << endl;
while (s1h && (s1.back() == '0' || s1.back() == '.')) {
if (s1.back() == '.') {
s1.pop_back();
break;
}
s1.pop_back();
}
while (s2h && (s2.back() == '.' || s2.back() == '0')) {
if (s2.back() == '.') {
s2.pop_back();
break;
}
s2.pop_back();
}
// cout << "s1: " << s1 << " " << "t1: " << t1 << endl;
// cout << "s2: " << s2 << " " << "t2: " << t2 << endl;
if ((t1.size() == 0 || t2.size() == 0 || (f1 && f2)) && s1.size() != s2.size()) return false;
for (int i = 0; i < min((int)s1.size(), (int)s2.size()); ++ i) {
if (s1[i] != s2[i]) return false;
}
return true;
}
};
180 场
第一题
class Solution {
public:
vector<int> luckyNumbers (vector<vector<int>>& mx) {
vector<int> ret;
int xi = 1e5 + 5;
vector<int> d(mx[0].size());
for (int i = 0; i < mx[0].size(); ++ i) {
for (int j = 0; j < mx.size(); ++ j) {
d[i] = max(d[i], mx[j][i]);
}
}
for (int i = 0; i < mx.size(); ++ i) {
int t = 0;
for (int j = 0; j < mx[0].size(); ++ j) {
if (mx[i][j] < mx[i][t])
t = j;
}
if (mx[i][t] == d[t]) ret.push_back(d[t]);
}
return ret;
}
};
第二题
class CustomStack {
public:
vector<int> stk;
int tot;
CustomStack(int maxSize) {
tot = maxSize;
}
void push(int x) {
if (stk.size() < tot) {
stk.push_back(x);
}
}
int pop() {
if (stk.size() == 0) return -1;
int x = stk.back();
stk.pop_back();
return x;
}
void increment(int k, int val) {
for (int i = 0; i < min((int)stk.size(), k); ++ i) stk[i] += val;
}
};
/**
* Your CustomStack object will be instantiated and called as such:
* CustomStack* obj = new CustomStack(maxSize);
* obj->push(x);
* int param_2 = obj->pop();
* obj->increment(k,val);
*/
第三题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> nums;
void dfs(TreeNode* root) {
if (root->left) {
dfs(root->left);
}
nums.push_back(root->val);
if (root->right) {
dfs(root->right);
}
}
TreeNode* ct(vector<int>& nums, int l, int r) {
if (l == r) {
TreeNode* nw = new TreeNode(nums[l]);
return nw;
}
if (l + 1 == r) {
TreeNode* nw = new TreeNode(nums[l]);
nw->right = new TreeNode(nums[r]);
return nw;
}
int mid = l + r >> 1;
TreeNode* nw = new TreeNode(nums[mid]);
nw->left = ct(nums, l, mid - 1);
nw->right = ct(nums, mid + 1, r);
return nw;
}
TreeNode* balanceBST(TreeNode* root) {
dfs(root);
return ct(nums, 0, nums.size() - 1);
}
};
第四题
将所有的工程师按效率降序排序
遍历到第 i 个工程师,即将这个工程师加入到团队,并在前 i 个工程师中选速度最大的前 k - 1 个工程师(这里用 小顶堆 优化)
#define pii pair<int, int>
class Solution {
public:
vector<pii> team;
int mod = 1e9 + 7;
int maxPerformance(int n, vector<int>& sd, vector<int>& ey, int k) {
for (int i = 0; i < n; ++ i) {
team.push_back({sd[i], ey[i]});
}
sort(team.begin(), team.end(), [](pii& a, pii& b) {
return a.second > b.second;
});
long long sum = 0;
long long ret = 0;
priority_queue<int, vector<int>, greater<int> > q;
for (int i = 0; i < k; ++ i) {
q.push(team[i].first);
sum += team[i].first;
ret = max(ret, sum * team[i].second);
}
for (int i = k; i < n; ++ i) {
sum -= q.top();
q.pop();
sum += team[i].first;
q.push(team[i].first);
ret = max(ret, sum * team[i].second);
}
return ret % mod;
}
};
175 场
第一题
class Solution {
public:
bool checkIfExist(vector<int>& arr) {
unordered_set<int> st;
for (int i = 0; i < arr.size(); ++ i) {
if (st.count(arr[i] * 2)) return true;
if (arr[i] % 2 == 0 && st.count(arr[i] / 2)) return true;
st.insert(arr[i]);
}
return false;
}
};
第二题
class Solution {
public:
int minSteps(string s, string t) {
int cnt[26];
memset(cnt, 0, sizeof cnt);
for (int i = 0; i < s.size(); ++ i) {
cnt[s[i] - 'a'] --;
cnt[t[i] - 'a'] ++;
}
int tot = 0;
for (int i = 0; i < 26; ++ i) {
tot += abs(cnt[i]);
}
return tot / 2;
}
};
第三题
class TweetCounts {
unordered_map<string, vector<int>> mp;
public:
TweetCounts() {
}
void recordTweet(string tweetName, int time) {
mp[tweetName].push_back(time);
}
vector<int> getTweetCountsPerFrequency(string fq, string te, int se, int ee) {
int len;
if (fq == "minute") len = 60;
else if (fq == "hour") len = 60 * 60;
else len = 60 * 60 * 24;
vector<int> ret((ee - se) / len + 1);
for (int t : mp[te])
if (t >= se && t <= ee)
++ ret[(t - se) / len];
return ret;
}
};
第四题
可放的数量 = 总点数 - 最小权点覆盖集
建图参考
#define INF 0x3f3f3f3f
class Solution {
public:
static const int N = 1000;
int h[N], e[N], ne[N], f[N], idx;
int dx[4] = {0, 0, -1, -1};
int dy[4] = {-1, 1, -1, 1};
int q[N], cur[N], d[N];
int S, T, n, m;
void add(int a, int b, int c) {
e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++;
e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++;
}
bool bfs() {
for (int i = 0; i < N; ++ i) d[i] = -1;
int hh = 0, tt = 0;
q[tt ++] = S, d[S] = 0, cur[S] = h[S];
while (hh < tt) {
int t = q[hh ++];
for (int i = h[t]; i != -1; i = ne[i]) {
int ver = e[i];
if (d[ver] == -1 && f[i]) {
d[ver] = d[t] + 1;
cur[ver] = h[ver];
if (ver == T) return true;
q[tt ++] = ver;
}
}
}
return false;
}
int find(int u, int limit) {
if (u == T) return limit;
int flow = 0;
for(int i = cur[u]; i != -1 && flow < limit; i = ne[i]) {
int ver = e[i];
cur[u] = i;
if (d[ver] == d[u] + 1 && f[i]) {
int t = find(ver, min(limit - flow, f[i]));
if (!t) d[ver] = -1;
f[i] -= t, f[i ^ 1] += t, flow += t;
}
}
return flow;
}
int dinic() {
int ret = 0, flow = 0;
while (bfs()) while (flow = find(S, INF)) ret += flow;
return ret;
}
int get(int x, int y) {
return x * m + y + 1;
}
int maxStudents(vector<vector<char>>& ss) {
n = ss.size();
m = ss[0].size();
int tot = 0;
S = N - 1, T = N - 2;
memset(h, -1, sizeof h);
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (ss[i][j] == '.') {
++ tot;
int x = i * m + j + 1;
if (j & 1) add(S, x, 1);
else add(x, T, 1);
if (j - 1 >= 0 && ss[i][j-1] == '.')
{
if (j & 1) add(x, get(i, j - 1), 1);
else add(get(i, j - 1), x, 1);
}
if (j + 1 < m && ss[i][j+1] == '.')
{
if (j & 1) add(x, get(i, j + 1), 1);
else add(get(i, j + 1), x, 1);
}
if (i && j + 1 < m && ss[i - 1][j + 1] == '.')
{
if (j & 1) add(x, get(i - 1, j + 1), 1);
else add(get(i - 1, j + 1), x, 1);
}
if (i && j && ss[i - 1][j - 1] == '.')
{
if (j & 1) add(x, get(i - 1, j - 1), 1);
else add(get(i - 1, j - 1), x, 1);
}
}
}
}
return tot - dinic();
}
};

浙公网安备 33010602011771号