美团第一次笔试
1、模拟即可,注意模一下
#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 1e3 + 10;
char s[MAXN], t[MAXN], x[MAXN];
int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%s", s + 1); int n = strlen(s + 1);
int p = 0, r = 0;
for (int i = 1; i <= n; ++i) {
if (s[i] >= '0' && s[i] <= '9') {
p = p * 10 + s[i] - '0';
} else {
if (r > 0) p %= r;
int xx = 0;
for (int j = p + 1; j <= r; ++j) {
x[++xx] = t[j];
}
for (int j = 1; j <= p; ++j) {
x[++xx] = t[j];
}
for (int j = 1; j <= r; ++j) {
t[j] = x[j];
}
p = 0;
if (s[i] == 'R') {
std::reverse(t + 1, t + 1 + r);
} else {
t[++r] = s[i];
}
}
}
t[r + 1] = 0;
printf("%s\n", t + 1);
}
return 0;
}
2、题面写得像史,一开始题读假了,好在代码改一下就能过。按xy分别排序后存起来二分即可
#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 1e5 + 10;
struct Node {
int x, y, idx;
} a[MAXN];
int alls[MAXN];
int get(int x) {
return x > 0;
}
int main() {
int n; scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d%d", &a[i].x, &a[i].y);
a[i].idx = i;
}
std::unordered_map<int, std::vector<int>> xs, ys;
std::sort(a + 1, a + 1 + n, [](Node a, Node b) {
if (a.x == b.x) return a.y < b.y;
else return a.x < b.x;
});
for (int i = 1; i <= n; ++i) {
xs[a[i].x].push_back(a[i].y);
}
std::sort(a + 1, a + 1 + n, [](Node a, Node b) {
if (a.y == b.y) return a.x < b.x;
else return a.y < b.y;
});
for (int i = 1; i <= n; ++i) {
ys[a[i].y].push_back(a[i].x);
}
for (int i = 1; i <= n; ++i) {
int x = a[i].x, y = a[i].y;
int posx = std::lower_bound(xs[x].begin(), xs[x].end(), y) - xs[x].begin();
int posy = std::lower_bound(ys[y].begin(), ys[y].end(), x) - ys[y].begin();
int ans = 0;
ans += get(posx - 1);
ans += get((int)xs[x].size() - 2 - posx);
ans += get(posy - 1);
ans += get((int)ys[y].size() - 2 - posy);
alls[a[i].idx] = ans;
}
for (int i = 1; i <= n; ++i) {
printf("%d\n", alls[i]);
}
return 0;
}
3、糊了一个裸LCA+暴力上去0分,没绷住。时间不太够了,讨论下来应该是每个点向下向上维护最近的BUG三个字母,然后LCA即可,不太好写。
*更:似乎有用树链剖分做的,没板子谁写得出来啊
最难绷的是选择题有一道做的时候感觉不太对,但是还是直接交了,结果糊LCA的时候发条消息过来说改题了,做题系统必须提交才能退出去改。
唉,AI面得像史,笔试还得二战
查看12道真题和解析