2025 贵阳 代码源 Day 16 模拟赛 code

upd in 2025/8/9: 新增 B 题代码。

A

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define DB double
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 5e5 + 10, M = 2e6 + 10;
const LL P = 1e9 + 7;
int n; LL a[N], v[N];
LL ksm(LL x, LL y) {
	LL res = 1;
	while (y) {
		if (y & 1) res = (res * x) % P;
		x = (x * x) % P;
		y >>= 1;
	}
	return res;
}
int work() {
	cin >> n;
	LL tot = 1;
	for (int i = 1; i <= n; i++) cin >> a[i], tot = (tot * (ksm(2, a[i]))) % P;
	for (int i = 1; i <= n; i++) cin >> v[i];
	LL ans = 0;
	for (int i = 1; i <= n; i++) {
		ans += (ksm(v[i] + 1, a[i]) - 1) * ((tot * ksm(ksm(2, a[i]), P - 2)) % P) % P; ans %= P;
	}
	cout << ans;
	return 0;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	// init();
	// freopen("test.in", "r", stdin);
	// freopen("test.out", "w", stdout);
	int T = 1;
	// cin >> T;
	while (T--) { work(); }
	return 0;
}

B

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define DB double
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
const int N = 1e5 + 10, M = 1e5;
const LL P = 998244353;
int n, m; LL f[210][(int)1e4 + 10];
LL fac[N], inv[N];
LL ksm(LL a, LL b) {
    LL res = 1;
    while (b > 0) {
        if (b & 1) res = (res * a) % P;
        a = (a * a) % P;
        b >>= 1;
    }
    return res;
}
void init() {
    fac[0] = 1; for (int i = 1; i <= M; i++) fac[i] = (fac[i - 1] * i) % P;
    inv[M] = ksm(fac[M], P - 2); for (int i = M; i >= 1; i--) inv[i - 1] = (inv[i] * i) % P;
}
LL C(LL x, LL y) {
    if (y > x) return 0;
    if (x < 0 || y < 0) return 0;
    return fac[x] * inv[y] % P * inv[x - y] % P;
}
int work() {
    cin >> n >> m;
    int cnt = 0;
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            cnt++;
            if (i * i != n) cnt++;
        }
    }
    map<int, int> mp;
    for (int i = 2; i * i <= n; i++) {
        while (n % i == 0) {mp[i]++, n /= i;}
    }
    if (n > 1) mp[n]++;
    LL ans = 1;
    for (auto it : mp) {
        int x = it.sc;
        f[0][0] = 1; for (int i = 1; i <= 2 * m; i++) for (int j = 0; j <= x * m; j++) f[i][j] = 0;
        for (int i = 1; i <= 2 * m; i++) {
            for (int j = 0; j <= x * m; j++) {
                for (int k = 0; k <= min(j, x); k++) f[i][j] = (f[i][j] + f[i - 1][j - k]) % P;
            }
        }
        ans *= f[2 * m][x * m], ans %= P;
    }
    cout << (ksm(cnt, 2 * m) + ans) % P * ksm(2, P - 2) % P;
    return 0;
}
signed main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    init();
	// freopen("test.in", "r", stdin);
	// freopen("test.out", "w", stdout);
    int T = 1;
    // T = read();
    // cin >> T;
    while (T--) { work(); }
    return 0;
}

C

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define DB double
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 2e5 + 10, M = 8e5 + 10;
const LL P = 998244353;
int n; LL f[N];
struct node {
	LL x, y, a, b;
} nd[N];
bool cmp(node x, node y) {
	if (x.x != y.x) return x.x < y.x;
	return x.y > y.y;
}
struct SEG {
	LL mx[M], t[M];
	void push_up(int u) {
		int ls = (u << 1), rs = ((u << 1) | 1);
		mx[u] = max(mx[ls], mx[rs]);
	}
	void build(int u, int l, int r) {
		mx[u] = t[u] = 0;
		if (l == r) {
			return;
		}
		int mid = (l + r) >> 1, ls = (u << 1), rs = ((u << 1) | 1);
		build(ls, l, mid); build(rs, mid + 1, r);
		push_up(u);
	}
	void addt(int u, LL k) {
		mx[u] += k;
		t[u] += k;
	}
	void push_down(int u) {
		if (t[u]) {
			int ls = (u << 1), rs = ((u << 1) | 1);
			addt(ls, t[u]); addt(rs, t[u]);
			t[u] = 0;
		}
	}

	void add(int u, int l, int r, int x, int y, LL k) {
		if (l > y || r < x) return;
		if (l >= x && r <= y) {
			addt(u, k); return;
		}
		push_down(u);
		int mid = (l + r) >> 1, ls = (u << 1), rs = ((u << 1) | 1);
		add(ls, l, mid, x, y, k); add(rs, mid + 1, r, x, y, k);
		push_up(u);
	}
	LL ask(int u, int l, int r, int x, int y) {
		if (l > y || r < x) return 0;
		if (l >= x && r <= y) {
			return mx[u];
		}
		push_down(u);
		int mid = (l + r) >> 1, ls = (u << 1), rs = ((u << 1) | 1);
		return max(ask(ls, l, mid, x, y), ask(rs, mid + 1, r, x, y));
	}
} T;
int work() {
	cin >> n;
	vector<LL> v;
	for (int i = 1; i <= n; i++) {
		cin >> nd[i].x >> nd[i].y >> nd[i].a >> nd[i].b;
		v.push_back(nd[i].y);
	}
	sort(nd + 1, nd + n + 1, cmp);
	sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());
	for (int i = 1; i <= n; i++) {
		nd[i].y = lower_bound(v.begin(), v.end(), nd[i].y) - v.begin() + 1;
	}
	int tot = v.size();
	T.build(1, 0, tot);
	for (int i = 1; i <= n; i++) {
		int y = nd[i].y;
		LL res = T.ask(1, 0, tot, 0, y - 1), ask = T.ask(1, 0, tot, y, y);
		if (ask < res) T.add(1, 0, tot, y, y, res - ask);
		T.add(1, 0, tot, 0, y - 1, nd[i].a);
		T.add(1, 0, tot, y, tot, nd[i].b);
	}
	cout << T.ask(1, 0, tot, 0, tot) << '\n';
	return 0;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	// init();
	// freopen("test.in", "r", stdin);
	// freopen("test.out", "w", stdout);
	int T = 1;
	cin >> T;
	while (T--) { work(); }
	return 0;
}

80 pts 的 dp 部分

for (int i = 1; i <= n; i++) {
    int y = nd[i].y;
    for (int j = 0; j < y; j++) {
        f[y] = max(f[y], f[j]);
    }
    for (int j = 0; j < y; j++) {
        f[j] += nd[i].a;
    }
    for (int j = y; j <= tot; j++) {
        f[j] += nd[i].b;
    }
    // cout << "  " << y << ' ' << f[y] << '\n';
}
LL ans = 0;
for (int i = 0; i <= tot; i++) ans = max(ans, f[i]);

D

两个 namespace T 都是 Tarjan;判断加重边时可以不用 map,我写边双加边的时候忘了写 id 了,用一个数组判断加没加过就行了。

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define DB double
// #define PII pair<int, int>
#define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 3e5 + 10, M = 3e5 + 10;
const LL P = 1e9 + 7;
int n, m;
struct node {
	LL v, w, id;
};
LL dis[2][N], ind[2][N];
bool fi[2][N];
vector<node> g[N], gt[N], gi[2][N];
void dij(int st, int t) {
	memset(dis[t], 0x3f, (n + 5) * sizeof(LL)); dis[t][st] = 0;
	priority_queue<PII, vector<PII>, greater<>> q; q.push({0, st});
	while (!q.empty()) {
		LL u = q.top().sc, d = q.top().fr; q.pop();
		if (d > dis[t][u]) continue;
		for (auto it : g[u]) {
			LL v = it.v, w = it.w;
			if (dis[t][v] > d + w) {
				dis[t][v] = d + w; q.push({d + w, v});
			}
		}
	}
}
map<PII, int> id, i2, d2;
namespace T { // Tarjan
	struct node {
		int to, nxt;
	} g[M << 1];
	int head[N], ect = 1;
	void add(int u, int v) {
		g[++ect].to = v;
		g[ect].nxt = head[u];
		head[u] = ect;
	}
	int dfn[N], low[N], idx = 0, cnt = 0;
	bool vis[N], ve[M << 1];
	stack<int> st;
	vector<PII> brg;
	void init() {
		ect = 1; idx = 0, cnt = 0;
		while (!st.empty()) st.pop();
		brg.clear();
		memset(head, -1, (n + 5) * sizeof(int));
	}
	void tarjan(int u) {
		// cout << u << endl;
		if(dfn[u]) return;
		dfn[u] = low[u] = ++idx;
		vis[u] = true;
		st.push(u);
		for(int i = head[u]; ~i; i = g[i].nxt) {
			int v = g[i].to;
			// cout << "    " << i << ' ' << v << endl;
			if(ve[i]) continue;
			ve[i] = ve[i ^ 1] = true;
			if(!dfn[v]) {
				tarjan(v);
				low[u] = min(low[u], low[v]);
				if(dfn[u] < low[v]) brg.push_back({u, v});
			}
			else if(vis[v]) low[u] = min(low[u], dfn[v]);
		}
		if(dfn[u] == low[u]) {
			int v = -1; cnt++;
			while(v != u) {
				v = st.top(); st.pop();
				vis[v] = false;
			}
		}
	}
	void solve() {
		memset(dfn, 0, (n + 5) * sizeof(int)); memset(low, 0, (n + 5) * sizeof(int));
		memset(vis, 0, (n + 5) * sizeof(bool)); memset(ve, 0, (m + 5) * sizeof(bool));
		for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i);
	}
}
namespace T2 { // Tarjan
	struct node {
		int to, nxt;
	} g[M << 1];
	int head[N], ect = 1;
	void add(int u, int v) {
		g[++ect].to = v;
		g[ect].nxt = head[u];
		head[u] = ect;
	}
	int dfn[N], low[N], idx = 0, cnt = 0;
	bool vis[N], ve[M << 1];
	stack<int> st;
	vector<PII> brg;
	void init() {
		ect = 1; idx = 0, cnt = 0;
		while (!st.empty()) st.pop();
		brg.clear();
		memset(head, -1, (n + 5) * sizeof(int));
	}
	void tarjan(int u) {
		if(dfn[u]) return;
		dfn[u] = low[u] = ++idx;
		vis[u] = true;
		st.push(u);
		for(int i = head[u]; ~i; i = g[i].nxt) {
			int v = g[i].to;
			if(ve[i]) continue;
			ve[i] = ve[i ^ 1] = true;
			if(!dfn[v]) {
				tarjan(v);
				low[u] = min(low[u], low[v]);
				if(dfn[u] < low[v]) brg.push_back({u, v});
			}
			else if(vis[v]) low[u] = min(low[u], dfn[v]);
		}
		if(dfn[u] == low[u]) {
			int v = -1; cnt++;
			while(v != u) {
				v = st.top(); st.pop();
				vis[v] = false;
			}
		}
	}
	void solve() {
		memset(dfn, 0, (n + 5) * sizeof(int)); memset(low, 0, (n + 5) * sizeof(int));
		memset(vis, 0, (n + 5) * sizeof(bool)); memset(ve, 0, (m + 5) * sizeof(bool));
		for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i);
	}
}
void topo(int t) {
	queue<int> q;
	for (int i = 1; i <= n; i++) if (!ind[t][i]) q.push(i);
	while (!q.empty()) {
		int u = q.front(); q.pop();
		for (auto it : gi[t][u]) {
			LL v = it.v;
			ind[t][v]--; fi[t][v] |= fi[t][u];
			if (fi[t][u] && !d2[{min(u, (int)v), max(u, (int)v)}]) {
				d2[{min(u, (int)v), max(u, (int)v)}] = 1;
				T2::add(u, (int)v); T2::add((int)v, u);
			}
			if (ind[t][v] == 0) {
				q.push((int)v);
			}
		}
	}
}
int work() {
	// cout << "AAA" << endl;
	cin >> n >> m; id.clear(); i2.clear(); d2.clear();
	for (int i = 1; i <= n; i++) g[i].clear(), gt[i].clear(), gi[0][i].clear(), gi[1][i].clear();
	// cout << "BBB" << endl;
	for (int i = 1, u, v, w; i <= m; i++) {
		cin >> u >> v >> w;
		g[u].push_back({v, w, i});
		g[v].push_back({u, w, i});
		if (u > v) swap(u, v); id[{u, v}] = i;
	}
	// cout << "CCC" << endl;
	dij(1, 0); dij(n, 1);
	// cout << "DDD" << endl;
	LL mnd = dis[0][n];
	// int cnti = 0;
	T::init(); T2::init();
	// cout << "EEE" << endl;
	for (int t = 0; t < 2; t++) memset(fi[t], false, (n + 5) * sizeof(bool)), memset(ind[t], 0, (n + 5) * sizeof(int));
	bool flag = false;
	for (int i = 1; i <= n; i++) {
		for (auto it : g[i]) {
			LL v = it.v, w = it.w;
			if (dis[0][v] == dis[0][i] + w) {
				gt[i].push_back(it);
			} if (dis[0][i] + dis[1][v] + w == mnd) {
				T::add(i, (int)v); T::add((int)v, i);
				gi[0][i].push_back(it);
				ind[0][v]++;
				gi[1][v].push_back({i, w, it.id});
				ind[1][i]++;
			} if (dis[0][i] + dis[1][v] + w == mnd + 1) {
				flag = true;
				fi[1][i] = fi[0][v] = true;
				if (!d2[{min(i, (int)v), max(i, (int)v)}]) {
					T2::add(i, (int)v); T2::add((int)v, i);
					d2[{min(i, (int)v), max(i, (int)v)}] = 1;
				}
			}
		}
	}
	// cout << "GGG " << flag << endl;
	if (!flag) {cout << 0 << '\n' << '\n'; return 0;}
	topo(0); topo(1);
	// cout << "HHH" << endl;
	T::solve(); T2::solve();
	// cout << "III" << endl;
	vector<int> ans; ans.clear();
	for (auto it : T2::brg) {
		LL u = it.fr, v = it.sc; if (u > v) swap(u, v);
		i2[{u, v}] = 1;
	}
	for (auto it : T::brg) {
		LL u = it.fr, v = it.sc; if (u > v) swap(u, v);
		if (!i2[{u, v}]) ans.push_back(id[{u, v}]);
	}
	sort(ans.begin(), ans.end()); ans.erase(unique(ans.begin(), ans.end()), ans.end());
	cout << ans.size() << '\n';
	for (auto it : ans) cout << it << ' ';
	cout << '\n';
	return 0;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	// init();
	// freopen("test.in", "r", stdin);
	// freopen("test.out", "w", stdout);
	int T = 1;
	cin >> T;
	while (T--) { work(); }
	return 0;
}
posted @ 2025-08-06 08:23  2020luke  阅读(40)  评论(0)    收藏  举报