【总结】综合测试1

T1——Red and Green Apples

Solution

Code

#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int MAXN = 1e5 + 5;
int x, y, a, b, c, ans, sum;
int p[MAXN], q[MAXN], r[MAXN];
bool cmp(int u, int v) { return u > v;}
signed main() {
	scanf("%lld %lld %lld %lld %lld", &x, &y, &a, &b, &c);
	sum = x + y;
	for (int i = 1; i <= a; i++)
		scanf("%lld", &p[i]);
	for (int i = 1; i <= b; i++)
		scanf("%lld", &q[i]);
	for (int i = 1; i <= c; i++)
		scanf("%lld", &r[i]);
	sort(p + 1, p + a + 1, cmp);
	sort(q + 1, q + b + 1, cmp);
	sort(r + 1, r + c + 1, cmp);
	int t1 = 1, t2 = 1, t3 = 1;
	while ((x || y) && sum) {
		if (!x && sum) {
			if (t3 > c)
				ans += q[t2++];
			else if (t2 > b)
				ans += r[t3++];
			else if (q[t2] > r[t3])
				ans += q[t2++];
			else
				ans += r[t3++];
			y--;
			sum--;
		}
		else if (!y && sum) {
			if (t3 > c)
				ans += p[t1++];
			else if (t1 > a)
				ans += r[t3++];
			else if (p[t1] > r[t3])
				ans += p[t1++];
			else
				ans += r[t3++];
			x--;
			sum--;
		}
		else if (sum) {
			if (t1 <= a && p[t1] >= q[t2] && p[t1] >= r[t3])
				ans += p[t1++], x--;
			else if (t2 <= b && q[t2] >= p[t1] && q[t2] >= r[t3])
				ans += q[t2++],	y--;
			else
				ans += r[t3++];
			sum--;
		}
	}
	printf("%lld", ans);
	return 0;
}

T2——Grudanje

Solution

Code

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#define int long long 
using namespace std;
const int MAXN = 2e5 + 5;
int n, q, ans, maxv;
char s[MAXN];
int x[MAXN], y[MAXN];
int p[MAXN];
int c[MAXN][27], c1[MAXN][27];
bool vis[MAXN];
void update(int x, int k, int id) {
	c1[x][id] += k;
}
int query(int x, int id) {
	return c[x][id];
}
bool check(int m) {
	for (int i = 0; i <= maxv; i++)
		if (vis[i]) 
			for (int j = 1; j <= n; j++)
				c[j][i] = c1[j][i];
	for (int i = 0; i <= maxv; i++)
		if (vis[i]) 
			for (int j = 1; j <= n; j++)
				c[j][i] += c[j - 1][i];
	for (int i = 0; i <= maxv; i++)
		if (vis[i]) 
			for (int j = 1; j <= q; j++) {
				int l = x[j], r = y[j];
				if (query(r, i) - query(l - 1, i) > 1)
					return 0;
			}
	return 1;
}
signed main() {
	scanf("%s", s + 1);
	n = strlen(s + 1);
	scanf("%lld", &q);
	for (int i = 1; i <= q; i++)
		scanf("%lld %lld", &x[i], &y[i]);
	for (int i = 1; i <= n; i++)
		scanf("%lld", &p[i]);
	for (int i = 1; i <= n; i++) {
		vis[s[i] - 'a'] = 1;
		maxv = max(maxv, 1ll * s[i] - 'a');
		update(i, 1, s[i] - 'a');
	}
	int l = 0, r = n;
	while (l <= r) {
		int mid = (l + r) >> 1;
		for (int i = 1; i <= mid; i++)
			update(p[i], -1, s[p[i]] - 'a');
		if (check(mid))
			ans = mid, r = mid - 1;
		else
			l = mid + 1; 
		for (int i = 1; i <= mid; i++)
			update(p[i], 1, s[p[i]] - 'a');
	}
	printf("%lld", ans);
	return 0;
}

T3——Deliver the Cake

Solution

Code

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define int long long
using namespace std;
using namespace std;
const int MAXN = 2e5 + 5, MAXM = 2e7 + 5, INF = 1e18;
int T;
int n, m, s, t, x;
char a[MAXN], b[MAXN];
int dis[MAXN];
int head[MAXN], nxt[MAXM], ver[MAXM], edge[MAXM], tot;
struct Node {
    int v, dis;
    bool operator < (const Node o) const {
        return dis > o.dis;
    }
};
void add(int x, int y, int z) {
	nxt[++tot] = head[x], head[x] = tot, ver[tot] = y, edge[tot] = z;
	nxt[++tot] = head[y], head[y] = tot, ver[tot] = x, edge[tot] = z;
}
void init() {
    for (int i = 1; i <= 2 * n; i++)
		head[i] = 0;
    tot = 0;
}
int dij(int s) {
    for (int i = 1; i <= 2 * n; i++)
		dis[i] = INF;
    priority_queue<Node> q;
    dis[s] = 0;
    q.push({s, 0});
    Node tmp;
    while (!q.empty()) {
        tmp = q.top();
        q.pop();
        int u = tmp.v;
        if (tmp.dis > dis[u])
            continue;
        for (int i = head[u]; i; i = nxt[i]) {
            int v = ver[i], w = edge[i] + (b[u] == b[v] ? 0 : x);
            if (dis[u] + w< dis[v]) {
                dis[v] = dis[u] + w;
                q.push({v, dis[v]});
            }
        }
    }
    return min(dis[t], dis[t + n]);
}
signed main() {
    scanf("%lld", &T);
    while (T--) {
        scanf("%lld %lld %lld %lld %lld", &n, &m, &s, &t, &x);
        init();
        scanf("%s", a);
        for (int i = 1; i <= n; i++) {
            if (a[i - 1] == 'M')
                b[i] = 'L', b[i + n] = 'R';
            else if (a[i - 1] == 'L')
                b[i] = b[i + n] = 'L';
            else
                b[i] = b[i + n] = 'R';
        }
        for (int i = 1; i <= m; i++) {
            int u, v, w;
            scanf("%lld %lld %lld", &u, &v, &w);
            add(u, v, w), add(u + n, v, w), add(u + n, v + n, w), add(u, v + n, w);
        }
        printf("%lld\n", min(dij(s), dij(s + n)));
    }
    return 0;
}

T4—— Very Easy Graph Problem

Solution

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e5 + 5, mod = 1e9 + 7;
int T;
int n, m, cnt;
int color[MAXN];
int u[MAXN], v[MAXN];
int fa[MAXN];
int dfn[MAXN];
bool vis[MAXN];
int num[MAXN][2], sum[2];
int head[MAXN], nxt[MAXN], ver[MAXN], tot;
void Make() {
	for (int i = 1; i <= n; i++)
		fa[i] = i;
}
int Find(int x) {
    return fa[x] == x ? x : fa[x] = Find(fa[x]);
}
void dfs(int u, int fa) {
    dfn[u] = ++cnt;
    num[u][0] = (color[u] == 0), num[u][1] = (color[u] == 1);
    for (int i = head[u]; i; i = nxt[i]) {
        int v = ver[i];
        if (v == fa)
            continue;
        dfs(v, u);
        num[u][0] += num[v][0], num[u][1] += num[v][1];
    }
}
int qpow(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
void add(int x, int y) {
	nxt[++tot] = head[x], head[x] = tot, ver[tot] = y;
}
signed main() {
    scanf("%d", &T);
    while (T--) {
        scanf("%d %d", &n, &m);
        sum[0] = sum[1] = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%d", &color[i]);
            sum[0] += (color[i] == 0), sum[1] += (color[i] == 1);
        }
        tot = 0;
        memset(ver, 0, sizeof(ver)), memset(head, 0, sizeof(head)), memset(vis, 0, sizeof(vis));
        Make();
        for (int i = 1; i <= m; i++) {
            scanf("%d %d", &u[i], &v[i]);
            int x = Find(u[i]), y = Find(v[i]);
            if (x != y) {
            	fa[x] = y, vis[i] = 1;
            	add(u[i], v[i]), add(v[i], u[i]);
			}
        }
        cnt = 0;
        dfs(1, 0);
        int ans = 0;
        for (int i = 1; i <= m; i++) {
            if (!vis[i])
                continue;
            int fa = u[i], son = v[i];
            if (dfn[fa] > dfn[son])
                swap(fa, son);
            int f = sum[0] - num[son][0], f1 = sum[1] - num[son][1];
            ans = (ans + qpow(2, i) * (f * num[son][1] % mod) % mod) % mod;
            ans = (ans + qpow(2, i) * (f1 * num[son][0] % mod) % mod) % mod;
        }
        printf("%lld\n", ans);
    }
    return 0;
}
posted @   zhou_ziyi  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示