- 问题还是不少, 一直在改T1在考试时竟没有去想T2的暴力, 这道题的暴力人均二十分啊,我却没有写,时间分配有问题吧,T1 30分中间分,T3 也没有别人的暴力分足。
感觉现在就是拼暴力,谁考虑的周到,谁细节处理的好就能拿高分,好好练习吧,平常做题目时也要从暴力开始,像考试对待题目那样对待平时的练习,暴力该写就写,对拍也不能少,加油吧!
星际旅行
题目描述
样例
题解
- 题中很特殊的给出,恰好 \(2\) 条边 \(1\) 次经过,\(m-2\) 条边 \(2\) 次经过,大概可以想到用欧拉路。
- 将每条边拆为两条,问题转化为删去两条不同的边,使图中存在欧拉路。
- 判断每个点的度数即可,在每个边拆为两条之后,每个点的度一定是偶数。
- 分类讨论即可:
- 删去一个自环,奇偶性不发生任何改变。
- 删去一条普通边,所连的两个点奇偶性发生改变。
- 现在所要求的是,存在两个点度为奇数 或 所有点度均为偶数,且要保证一个边不能被删除两次。
- 所有的方案是:
- 删去一个点所对应的两条边
- 删去一个自环,再随便删一条边
- 删去两个自环
code
#include <bits/stdc++.h>
using namespace std;
#define print(x) cerr << #x << " : " << x << endl;
inline int read() {
int k = 0, f = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) k = k * 10 + ch - '0';
return k * f;
}
const int maxn = 4e5 + 100;
struct edge { int from, to; } e[maxn];
int vis[maxn];
vector<int> g[maxn];
void dfs(int u) {
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (vis[v]) continue;
vis[v]++;
dfs(v);
}
}
int mark[maxn];
int d[maxn];
int main() {
#ifndef debug
freopen("tour.in", "r", stdin);
freopen("tour.out", "w", stdout);
#endif
int n = read(), m = read();
for (int i = 1; i <= m; i++) {
e[i].from = read();
e[i].to = read();
d[e[i].from]++;
d[e[i].to]++;
g[e[i].from].push_back(e[i].to);
g[e[i].to].push_back(e[i].from);
}
vis[e[1].from] = 1;
dfs(e[1].from);
for (int i = 1; i <= m; i++)
if (vis[e[i].from] == 0 && vis[e[i].to] == 0)
return cout << 0 << endl, 0;
int cnt = 0;
long long ans = 0;
for (int i = 1; i <= m; i++) {
if (e[i].from == e[i].to) {
mark[i] = 1;
d[e[i].from] -= 2;
cnt++;
ans += m - cnt;
}
}
for (int i = 1; i <= m; i++) {
if (mark[i]) continue;
d[e[i].from]--;
d[e[i].to]--;
ans += d[e[i].from] + d[e[i].to];
}
cout << ans << endl;
}
matrix
题目描述
code
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int k = 0, f = 1; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) k = k * 10 + ch - '0';
return k * f;
}
#define int long long
const int maxn = 3000 + 100;
const int mod = 998244353;
int n, m;
int f[maxn][maxn], totl[maxn], totr[maxn];
int A(int n, int m) {
int ans = 1;
for (int i = 1; i <= n; i++) ans *= i;
for (int i = 1; i <= (n - m); i++) ans /= i;
return ans;
}
signed main() {
#ifndef debug
freopen("matrix.in", "r", stdin);
freopen("matrix.out", "w", stdout);
#endif
n = read(), m = read();
for (int i = 1; i <= n; i++) {
int l, r;
scanf("%lld%lld", &l, &r);
totl[l]++, totr[r]++;
}
for (int i = 1; i <= m; i++) {
totl[i] += totl[i - 1];
totr[i] += totr[i - 1];
}
f[0][0] = 1;
for (int i = 1; i <= m; i++) {
for (int j = 0; j <= i; j++)
f[i][j] = (f[i - 1][j - 1] * (totr[i] - j + 1) % mod * A(i - totl[i - 1] - j, totl[i] - totl[i - 1]) % mod + \
f[i - 1][j] * A(i - totl[i - 1] - j, totl[i] - totl[i - 1]) % mod) % mod;
}
cout << f[m][n] << endl;
}
走迷宫
题目描述
题解
coding