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;

注意:

  1. cnt>=2 的判断一定要放在后面

  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 写的。

注意:

  1. 判断高度。高的不能填。

  2. 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 中国大陆许可协议进行许可。

posted @   aaaaaaqqqqqq  阅读(2)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.