2023/2/19 Contest Solution
最近考运不好啊。。。
月赛爆零,就连离线赛都只打到200出头。
题要继续刷的,比赛要继续打的。能走多远走多远吧。
T1-Point
刚看:c,水题
10min 打出暴力:
#include <bits/stdc++.h> typedef long long ll; using namespace std; int x[100010], n, d; ll cnt = 0; int main() { //freopen("Point.in", "r", stdin); //freopen("Point.out", "w", stdout); scanf("%d%d", &n, &d); for (int i = 1; i <= n; i++) { scanf("%d", x + i); } for (int i = 1; i <= n - 2; i++) { for (int j = i + 2; j <= n; j++) { if (x[j] - x[i] > d) { break; } cnt += j - i - 1; } } printf("%lld",cnt); return 0; }
可以看到 $n$ 在 $10^5$ 范围内,而这个算法是$O(n^2)$的。
我当时觉得常数比较小,就没管,结果啪啪打脸。
正解用二分,往后扫最末尾的符合要求的,直接确定范围,等差数列公式算。
Time Limit Exceeded.
#include <bits/stdc++.h> typedef long long ll; using namespace std; ll x[101010], n, d; ll cnt = 0; ll binarysch(ll target) { ll mid, l = target, r = n; while (l < r) { mid = (l + r + 1) >> 1; if (x[mid] <= x[target] + d) { l = mid; } else { r = mid - 1; } } return l; } int main() { // freopen("Point.in", "r", stdin); // freopen("Point.out", "w", stdout); scanf("%lld%lld", &n, &d); for (ll i = 1; i <= n; i++) { scanf("%lld", x + i); } for (ll i = 1; i <= n - 2; i++) { ll tag = binarysch(i); cnt += (tag - i) * (tag - i - 1) / 2; } printf("%lld", cnt); return 0; }
T2-Light
一道数学题。 数据还算仁慈,错误的做法都能拿94。
错解:求出n最小的非1因数,可以证明它一定是个质数。
正解:
#include <bits/stdc++.h> #define ll long long using namespace std; bool isprime(ll x) { if (x == 2) { return true; } for (ll i = 2; i * i <= x; i++) { if (x % i == 0) { return false; } } return true; } ll n, cnt = 0, tmp; int main() { cin >> n; if (isprime(n)) { cout << n; return 0; } for (ll i = 2; i <= n; i++) { if (n % i == 0) { cnt++; tmp = i; while (n % i == 0) { n /= i; } } if (cnt >= 2) { cout << 1; return 0; } } cout << tmp; return 0;
注意:
-
cnt>=2
的判断一定要放在后面 -
最开始要判断一下是不是质数,复杂度 $O(\sqrt n)$ ,要不然会超时。
T3-Cow
乍一看,这不简单嘛,既然要能互相看见的两头牛中间的身高要小一些,直接区间减一。
BIT/差分。
但!是!
有的中间已经满足了,如果再减一就不满足最大的要求了。
所以只能区间扫一遍,如果有不满足的就减到满足为止。
正解:
#include <bits/stdc++.h> using namespace std; int n, p, h, m; int a[10010]; // diff[i] = a[i] - a[i - 1] pair <int, int>zhubian[10010]; bool cmp(pair<int, int>a, pair<int, int>b) { return a.second - a.first > b.second - b.first; } int main() { // freopen("Cow.in", "r", stdin); // freopen("Cow.out", "w", stdout); scanf("%d%d%d%d", &n, &p, &h, &m); for (int i = 1; i <= m ; i++) { scanf("%d%d", &zhubian[i].first, &zhubian[i].second); if (zhubian[i].first > zhubian[i].second) { swap(zhubian[i].first, zhubian[i].second); } } sort(zhubian + 1, zhubian + m + 1, cmp); for (int i = 1; i <= m; i++) { for (int j = zhubian[i].first + 1; j < zhubian[i].second; j++) { if (a[j] >= min(a[zhubian[i].first], a[zhubian[i].second])) { a[j]--; } } } for (int i = 1; i <= n; i++) { a[i] += h; printf("%d\n", a[i]); } return 0; }
没注释freopen就往OJ上交的我是xx
T4-Boat
核心思路是Floodfill。dfs 的实现可能更便捷。
反正我是用 dfs 写的。
注意:
-
判断高度。高的不能填。
-
fill起始点是边缘为
0
的地方。
正解:
#include <bits/stdc++.h> using namespace std; int boat[1010][1010], n, m, h; bool used[1010][1010]; void dfs(int x, int y) { if (x < 1 || x > n || y < 1 || y > m) { return; } if (used[x][y]) { return; } if (n - x + 1 > h) { used[x][y] = true; return; } if (boat[x][y] == 1 || boat[x][y] == 2) { used[x][y] = true; return; } boat[x][y] = 2; used[x][y] = true; dfs(x + 1, y); dfs(x - 1, y); dfs(x, y + 1); dfs(x, y - 1); } int main() { // freopen("Boat.in", "r", stdin); // freopen("Boat.out", "w", stdout); memset(used, 0, sizeof used); ios::sync_with_stdio(false); cin >> n >> m >> h; for (int i = 1; i <= n; i++) { string tmp; cin >> tmp; for (int j = 0; j < m; j++) { boat[i][j + 1] = tmp[j] - '0'; } } int tmpx = -1, tmpy = -1; for (int i = n - 1; i >= max(1, n - h + 1); i--) { if (boat[i][1] == 0) { tmpx = i; tmpy = 1; dfs(tmpx, tmpy); } if (boat[i][m] == 0) { tmpx = i; tmpy = m; dfs(tmpx, tmpy); } } for (int i = 1; i <= m; i++) { if (boat[n][i] == 0) { tmpx = n; tmpy = i; dfs(tmpx, tmpy); } if (boat[1][i] == 0) { tmpx = 1; tmpy = i; dfs(tmpx, tmpy); } } if (tmpx != -1 && tmpy != -1) { dfs(tmpx, tmpy); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cout << boat[i][j]; } cout << endl; } return 0; }
本文作者:aaaaaaqqqqqq
本文链接:https://www.cnblogs.com/aaaaaaqqqqqq/p/17976969
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步