全部题解:2024 -- 星航计划 -- 七月份 -- 基础算法组

mairuisheng  •  11个月前


网址:戳这里

比赛时间:7月12日至7月14日。

密码:MX-Algorithm-OI

比赛整体十分难!

难度升序(个人看法):T2<T1<T3<T4

目前没有犇犇AK掉了所有题。

———————————————————————————————————————————————

以下是部分代码:

T1 矩形

100分代码:

#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,k=0x7f,s[5],ans1,ans2,ans3;
long long n;
int main() 
{
    long long n;
    scanf("%lld %d %d %d %d",&n,&a,&b,&c,&d);
    s[1]=a+b;
    s[2]=a+c;
    s[3]=b+d;
    s[4]=c+d;
    ans1=max(s[1],max(s[2],max(s[3],s[4])));
    ans2=min(s[1],min(s[2],min(s[3],s[4])));
    ans3=n-ans1+ans2;
    ans3=max(ans3,0);
	printf("%d",ans3*n);
	return 0;
}
}

T2 数对

复杂又难推的公式。

100分代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000005],v[1000005],pr[1000005],k,n,i,j;
long long ans=1;
int main()
{
    scanf("%d",&n);
    for(i=2;i<=n;++i)
    {
        if(!v[i])
        {
        	v[i]=i;
			k++;
			pr[k]=i;
		}
        for(j=1;j<=k&&pr[j]*i<=n;++j)
        {
            v[i*pr[j]]=pr[j];
            if(i%pr[j]==0)break;
        }
    }

    for(i=1;i<=n;++i)
    {
        for(j=i;j>1;j/=v[j])
        {
            a[v[j]]++;
			a[v[j]]%=1000000007;
        }
    }
    for(i=1;i<=n;++i)
    {
    	ans*=(2*a[i]+1);
		ans%=1000000007;
	}
    printf("%lld",ans);
    return 0;
}

T3 次数

100分代码。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define int long long
#define endl '\n'
const int N = 3e5 + 55, MOD = 1e9 + 7;
int n, m, a[N];
vector<int> g[N];
signed main() {
    cin.tie(0), ios_base::sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i], g[a[i]].push_back(i);
    for (int i = 1, tp, x, y, z; i <= m; i++) {
        cin >> tp >> x;
        if (tp == 1) {
            cin >> y >> z;
            cout << upper_bound(g[z].begin(), g[z].end(), y) - lower_bound(g[z].begin(), g[z].end(), x)
                 << endl;
        } else {
            if (a[x] == a[x + 1])
                continue;
            auto t = lower_bound(g[a[x]].begin(), g[a[x]].end(), x);
            *t = x + 1;
            t = lower_bound(g[a[x + 1]].begin(), g[a[x + 1]].end(), x + 1);
            *t = x;
            swap(a[x], a[x + 1]);
        }
    }
    return 0;
}

T4 区间

100分代码

#include <cstdio>

const int maxn = 1e6 + 10;
long long n, m, c[maxn], b[maxn], k;
int s1[maxn], s2[maxn], sz1, sz2, p, ans;

int main() {
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%lld", c + i);
    while (m--) {
        scanf("%lld", &k);
        for (int i = 1; i <= n; i++) c[i] -= k;
        for (int i = 1; i <= n; i++) b[i] = b[i - 1] + c[i];
        s1[sz1 = 1] = 0;
        for (int i = 1; i <= n; i++) {
            if (b[s1[sz1]] > b[i])
                s1[++sz1] = i;
        }

        s2[sz2 = 1] = n;
        for (int i = n - 1; i >= 0; i--) {
            if (b[s2[sz2]] < b[i])
                s2[++sz2] = i;
        }
        p = 1;
        ans = 0;
        for (int i = sz2; i >= 1; i--) {
            while (p <= sz1 && b[s1[p]] > b[s2[i]]) p++;
            if (p <= sz1 && s2[i] - s1[p] > ans)
                ans = s2[i] - s1[p];
        }
        printf("%d\n", ans);

        for (int i = 1; i <= n; i++) c[i] += k;
    }
    return 0;
}

持续更新中...

T3和T4代码是我直接复制的,尊重码权。


评论: