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;
}