【2022-05-28-第79场双周赛】复盘

总结
Q4数据比较弱,所以没写完整的线段树也能过(听说有的语言暴力也能过?)
Q1.判断一个数的数字计数是否等于数位的值
RATING:1253
比较绕,直接模拟。
class Solution {
public:
bool digitCount(string num) {
int h[10] = {0};
for(auto c : num) h[c - '0']++;
for(int i = 0; i < num.size(); ++i) if(h[i] != (num[i] - '0')) return false;
return true;
}
};
Q2.最多单词数的发件人
RATING:1347
哈希模拟。
class Solution {
public:
string largestWordCount(vector<string>& m, vector<string>& s) {
unordered_map<string, int> mp;
int n = m.size();
for(int i = 0 ; i < n; ++i){
int t = 0;
for(auto &c : m[i]) if(c == ' ') ++t;
mp[s[i]] += t + 1;
}
string res = "";
int mx = 0;
for(auto &i : mp){
if(i.second > mx){
mx = i.second;
res = i.first;
}
else if(i.second == mx && i.first > res) res = i.first;
}
return res;
}
};
Q3.道路的最大总重要性
RATING:1496
大权值给度大的点。
class Solution {
public:
int d[50010] = {0};
long long ret = 0;
long long maximumImportance(int n, vector<vector<int>>& r) {
for(auto &e : r) ++d[e[0]], ++d[e[1]];
sort(d, d + n);
for(int i = 0 ; i < n; ++i) ret += (long long)(i + 1) * d[i];
return ret;
}
};
Q4.以组为单位订音乐会的门票
RATING:2470
用线段树维护每行预定数,进行查找插入等。
static const int io = []() {
std::ios::sync_with_stdio(0);
cin.tie(0);
return 0;
}();
class BookMyShow {
public:
int n, m;
int a[50010] = {0}, mi[200010] = {0};
long long f[200010] = {0};
void push_up(int k){
mi[k] = min(mi[k * 2], mi[k * 2 + 1]);
}
void buildTree(int k, int l, int r){
if(l == r){
f[k] = a[l];
return ;
}
int mid = (l + r) >> 1;
buildTree(k + k, l, mid);
buildTree(k + k + 1, mid + 1, r);
f[k] = f[k + k] + f[k + k + 1];
}
int getmi(int k, int l, int r, int x, int y){
if(l == x && r == y) return mi[k];
int mid = l + r >> 1;
if(y <= mid) return getmi(k + k, l , mid, x, y);
else if(x > mid) return getmi(k + k + 1, mid + 1, r, x, y);
else return min(getmi(k + k, l , mid, x, mid), getmi(k + k + 1, mid + 1, r, mid + 1, y));
}
long long calcInterval(int k, int l, int r, int s, int e){
if(l == s && r == e) return f[k];
int mid = (l + r) >> 1;
if(s > mid) return calcInterval(k + k + 1, mid + 1, r, s, e);
else if(e <= mid) return calcInterval(k + k, l, mid, s, e);
else return calcInterval(k + k, l, mid, s, mid) + calcInterval(k + k + 1, mid + 1, r, mid + 1, e);
}
void addSingle(int k, int l, int r, int x, int y){
f[k] += y;
if(l == r){
mi[k] += y;
return ;
}
int mid = (l + r) >> 1;
if(x <= mid) addSingle(k + k, l, mid, x, y);
else addSingle(k + k + 1, mid + 1, r, x, y);
push_up(k);
}
BookMyShow(int zz, int zzz) {
n = zz;
m = zzz;
buildTree(1, 1, n);
}
vector<int> gather(int k, int mxr) {
if(k > m || getmi(1, 1, n, 1, mxr + 1) > m - k) return {};
vector<int> ret;
for(int i = 1; i <= mxr + 1; ++i){
if(m - a[i] >= k){
ret.push_back(i - 1);
ret.push_back(a[i]);
a[i] += k;
addSingle(1, 1, n, i, k);
break;
}
}
return ret;
}
bool scatter(int k, int mxr) {
vector<int> ret;
if(calcInterval(1, 1, n, 1, mxr + 1) > (long long)(mxr + 1) * m - k) return false;
for(int i = 1; i <= mxr + 1; ++i){
if(a[i] == m) continue;
if(m - a[i] < k){
k -= m - a[i];
addSingle(1, 1, n, i, m - a[i]);
a[i] = m;
}
else{
a[i] += k;
addSingle(1, 1, n, i, k);
break;
}
}
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);
*/
浙公网安备 33010602011771号