Loading

The 2024 International Collegiate Programming Contest in Hubei Province, China



A - Long Live

题意

思路

\(a=1\) 时,\(ab\) 最大

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e6 + 10;

void solve()
{
    int x, y;
    cin >> x >> y;
    cout << 1 << " " << x * y / (__gcd(x, y) * __gcd(x, y)) << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int __ = 1;
    cin >> __;
    while (__--) solve();

    return 0;
}

B - Nana Likes Polygons

题意

思路

显然要选\(3\)个点组成三角形,数据很小直接枚举顶点,向量叉积算面积

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e6 + 10;

void solve()
{
	int n;
	cin >> n;
	vector<pii> a(n);
	for (auto& [x, y] : a)
	{
		cin >> x >> y;
	}
	double ans = 1e18;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (i == j) continue;
			for (int k = 0; k < n; k++)
			{
				if (i == k || j == k) continue;
				auto [x1, y1] = a[i];
				auto [x2, y2] = a[j];
				auto [x3, y3] = a[k];
				// 向量
				double X1 = 1.0 * x1 - x2;
				double Y1 = 1.0 * y1 - y2;
				double X2 = 1.0 * x1 - x3;
				double Y2 = 1.0 * y1 - y3;

				double area = fabs(X1 * Y2 - X2 * Y1) / 2;
				if (area >= 1e-6) ans = min(ans, area);
			}
		}
	}
	cout << fixed << setprecision(6) << (ans == 1e18 ? -1 : ans) << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	cin >> __;
	while (__--) solve();

	return 0;
}

E - Spicy or Grilled?

题意

思路

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e6 + 10;

void solve()
{
	int n, x, a, b;
	cin >> n >> x >> a >> b;
	cout << x * b + (n - x) * a << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	cin >> __;
	while (__--) solve();

	return 0;
}

G - Genshin Impact Startup Forbidden II

题意

思路

答奋模拟说是,fzb爆写\(1h^{++}\)

代码

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define PII pair<int, int> 
#define endl '\n'
#define inf 1e18
using namespace std;

int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };

void solve() {
    int n;
    cin >> n;

    vector<vector<int> > G(20, vector<int>(20));

    vector<int> f(20 * 20);

    for (int i = 1; i <= 19; ++i) {
        for (int j = 1; j <= 19; ++j) {
            int aim = 19 * (i - 1) + j;
            f[aim] = aim;
        }
    }

    function<int(int)> find = [&](int x) {
        if (f[x] == x) return x;
        return f[x] = find(f[x]);
    };

    vector<int> sum(20 * 20);
    
    auto merge = [&](int u, int v) {
        u = find(u);
        v = find(v);

        if (u == v) return;

        sum[v] += sum[u];
        sum[u] = 0;

        f[u] = v;
    };

    vector<vector<int> > sta(20, vector<int>(20));

    auto check = [&](int x, int y) {
        return (x >= 1 && x <= 19 && y >= 1 && y <= 19);
    };
    for (int T = 1; T <= n; ++T) {
        int x, y;
        cin >> x >> y;

        set<int> ord;

        if (T & 1) sta[x][y] = 1;
        else sta[x][y] = 2;

        int flag = sta[x][y];

        int aim = (x - 1) * 19 + y;
        f[aim] = aim;
        sum[aim] = 0;

        for (int i = 0; i < 4; ++i) {
            int cx = x + dx[i];
            int cy = y + dy[i];
            if (!check(cx, cy)) continue;

            if (!sta[cx][cy]) {
                sum[aim]++;
            }
            else {
                int u = (cx - 1) * 19 + cy;
                u = find(u);
                sum[u]--;
            }
        }

        for (int i = 0; i < 4; ++i) {
            int cx = x + dx[i];
            int cy = y + dy[i];
            if (!check(cx, cy)) continue;

            if (sta[cx][cy] == sta[x][y]) {
                int v = (cx - 1) * 19 + cy;
                merge(aim, v);
                aim = find(aim);
            }
        }

        for (int i = 0; i < 4; ++i) {
            int cx = x + dx[i];
            int cy = y + dy[i];
            if (!check(cx, cy)) continue;

            if (sta[cx][cy] && sta[cx][cy] != sta[x][y]) {
                int u = (cx - 1) * 19 + cy;
                u = find(u);
                if (sum[u] == 0) ord.insert(u);
            }
        }

        int sum1 = 0, sum2 = 0;

        for (int xx = 1; xx <= 19; ++xx) {
            for (int yy = 1; yy <= 19; ++yy) {
                if (!sta[xx][yy]) continue;
                int u = (xx - 1) * 19 + yy;

                if (ord.count(find(u))) {
                    for (int k = 0; k < 4; ++k) {
                        int cx = xx + dx[k];
                        int cy = yy + dy[k];
                        if (!check(cx, cy)) continue;

                        int v = (cx - 1) * 19 + cy;
                        v = find(v);

                        if (sta[cx][cy] && sta[cx][cy] == sta[x][y]) {
                            sum[v]++;
                        }
                    }
                    sta[xx][yy] = 0;
                    flag == 1 ? sum2++ : sum1++;
                    f[u] = u;
                    sum[u] = 0;
                }
            }
        }

        aim = find(aim);
        if (sum[aim] == 0) {
            for (int xx = 1; xx <= 19; ++xx) {
                for (int yy = 1; yy <= 19; ++yy) {
                    if (!sta[xx][yy]) continue;
                    int u = (xx - 1) * 19 + yy;

                    if (find(u) == aim) {
                        for (int k = 0; k < 4; ++k) {
                            int cx = xx + dx[k];
                            int cy = yy + dy[k];
                            if (!check(cx, cy)) continue;

                            int v = (cx - 1) * 19 + cy;
                            v = find(v);

                            if (sta[cx][cy] && sta[cx][cy] != sta[x][y]) {
                                sum[v]++;
                            }
                        }
                        sta[xx][yy] = 0;
                        flag == 1 ? sum1++ : sum2++;
                        f[u] = u;
                        sum[u] = 0;
                    }
                }
            }
        }
        cout << sum1 << ' ' << sum2 << endl;
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int T = 1;
    //cin >> T;
    while (T--) {
        solve();
    }

    return 0;
}

H - Genshin Impact Startup Forbidden III

题意

思路

格子中鱼的数量只会是 \(0、1、2、3\),即把鱼的数量压成四进制

代码

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define PII pair<int, int> 
#define endl '\n'
#define inf 1e18
using namespace std;

struct node {
    int x, y, cnt;
};

int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };

void solve() {
    int n, m, k;
    cin >> n >> m >> k;

    vector<int> p4(15);
    p4[0] = 1;

    for (int i = 1; i <= 10; ++i) {
        p4[i] = p4[i - 1] * 4;
    }


    vector<vector<int> > mp(n + 1, vector<int>(m + 1, 0));
    vector<node> t(k + 1);

    int now = 0;

    for (int i = 1; i <= k; ++i) {
        int x, y, cnt;
        cin >> x >> y >> cnt;

        now += p4[i - 1] * cnt;

        t[i] = { x, y, cnt };
        mp[x][y] = i;
    }

    vector<int> f(p4[k], inf);

    f[now] = 0;

    auto check = [&](int x, int y) {
        return (x >= 1 && x <= n && y >= 1 && y <= m);
    };

    for (int i = now; i; --i) {
        if (f[i] == inf) continue;

        for (int j = 1; j <= k; ++j) {
            if (i / p4[j - 1] % 4) {
                auto [x, y, cnt] = t[j];

                int st = i;
                int p = mp[x][y];

                if (p && st / p4[p - 1] % 4) {
                    st -= p4[p - 1];
                }

                for (int s = 0; s < 4; ++s) {
                    int cx = x + dx[s];
                    int cy = y + dy[s];
                    if (!check(cx, cy)) continue;

                    p = mp[cx][cy];
                    if (p && st / p4[p - 1] % 4) {
                        st -= p4[p - 1];
                    }

                }
                f[st] = min(f[st], f[i] + 1);


                for (int s = 0; s < 4; ++s) {
                    int cx = x + dx[s];
                    int cy = y + dy[s];
                    if (!check(cx, cy)) continue;

                    st = i;
                    p = mp[cx][cy];
                    if (p && st / p4[p - 1] % 4) {
                        st -= p4[p - 1];
                    }

                    for (int a = 0; a < 4; ++a) {
                        int nx = cx + dx[a];
                        int ny = cy + dy[a];
                        if (!check(nx, ny)) continue;

                        p = mp[nx][ny];
                        if (p && st / p4[p - 1] % 4) {
                            st -= p4[p - 1];
                        }
                    }
                    f[st] = min(f[st], f[i] + 1);
                }
            }
        }
    }

    cout << f[0] << endl;

}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int T = 1;
    //cin >> T;
    while (T--) {
        solve();
    }

    return 0;
}

J - Points on the Number Axis A

题意

思路

随机取两个点,即每个点被取到的概率相等,最后一个点的期望位置就是 \(\frac 1 n{\sum_{i=1}^n x_i}\)

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e6 + 10;
const int mod = 998244353;

int qpow(int base, int a)
{
	int res = 1;
	while (a)
	{
		if (a & 1) res = res * base % mod;
		base = base * base % mod;
		a >>= 1;
	}
	return res;
}

int inv(int x)
{
	return qpow(x, mod - 2) % mod;
}

void solve()
{
	int n, sum = 0, x;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		sum = (sum + x) % mod;
	}
	cout << sum * inv(n) % mod << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	//cin >> __;
	while (__--) solve();

	return 0;
}

L - LCMs

题意

思路

非互质特判见代码;对于互质的 \(a\)\(b\),设二者最小质因数为 \(p\)\(q\),最终的答案就是从 \(a\) 出发, 以 \(2、p、q\) 作为中转点的最短路径

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e6 + 10;
const int mod = 998244353;

int f(int x)
{
	for (int i = 2; i <= sqrt(x); i++)
	{
		if (x % i == 0) return i;
	}
	return x;
}

void solve()
{
	int a, b;
	cin >> a >> b;
	if (a == b) cout << 0 << endl;
	else if (b % a == 0) cout << b << endl;
	else if (gcd(a, b) != 1) cout << a + b << endl;
	else
	{
		int p = f(a), q = f(b), ans = 1e18;
		ans = min(ans, lcm(a, b));
		ans = min(ans, lcm(a, p) + lcm(p, b));
		ans = min(ans, lcm(a, q) + lcm(q, b));
		ans = min(ans, lcm(a, 2) + lcm(2, b));
		ans = min(ans, lcm(a, p) + lcm(p, q) + lcm(q, b));
		ans = min(ans, lcm(a, p) + lcm(p, 2) + lcm(2, b));
		ans = min(ans, lcm(a, 2) + lcm(2, q) + lcm(q, b));
		ans = min(ans, lcm(a, p) + lcm(p, 2) + lcm(2, q) + lcm(q, b));
		cout << ans << endl;
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	cin >> __;
	while (__--) solve();

	return 0;
}


比赛链接 https://codeforces.com/gym/105139

posted @ 2025-05-06 19:52  _SeiI  阅读(82)  评论(0)    收藏  举报