先看2095:
2095题目:
好了,题目看完了,接下来是我的代码。
2095代码:
#include <bits/stdc++.h>
inline int read() {
int x = 0;
bool f = true;
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-')
f = false;
for (; isdigit(ch); ch = getchar())
x = (x << 1) + (x << 3) + ch - '0';
return f ? x : (~(x - 1));
}
const int maxn = 305;
const int maxm = (int)2e6 + 5;
int a[maxm];
std :: deque <int> st[maxn];
int id[maxn * 2];
typedef std :: pair <int, int> pii;
std :: vector <pii> ans;
inline void pu(int s) {
ans.emplace_back(s, 0);
}
inline void de(int s, int t) {
ans.emplace_back(s, t);
}
int spt;
std :: queue <int> q;
inline bool simple(int x) {
int s = id[x];
if (!s) {
if (q.empty())
return false;
id[x] = s = q.front();
q.pop();
pu(s);
st[s].push_back(x);
} else {
id[x] = 0;
q.push(s);
if (x == st[s].back()) {
pu(s);
st[s].pop_back();
} else {
pu(spt);
de(spt, s);
st[s].pop_front();
}
}
return true;
}
int main() {
for (int T = read(); T; --T) {
int n = read(), m = read(); read();
for (int i = 1; i <= m; ++i)
a[i] = read();
std :: memset(id, 0, sizeof(id));
ans.clear();
spt = n;
while (!q.empty())
q.pop();
for (int i = 1; i < n; ++i) {
q.push(i);
q.push(i);
}
for (int i = 1; i <= m; ++i) if (!simple(a[i])) {
int p = a[i];
int r = i + 1, x = a[r];
for (; r <= m && x != p && st[id[x]].back() == x; ++r, x = a[r]);
if (x == p) {
pu(spt);
for (int j = i + 1; j < r; ++j)
simple(a[j]);
pu(spt);
} else {
int s = id[x], y = st[s].back();
bool evn = true;
for (int j = i + 1; j < r; ++j)
if (a[j] == y)
evn = !evn;
if (evn) {
pu(s);
st[s].push_back(p);
for (int j = i + 1; j < r; ++j) {
if (a[j] == y)
pu(spt);
else
simple(a[j]);
}
pu(spt);
de(spt, s);
st[s].pop_front();
id[x] = 0;
id[p] = s;
} else {
pu(spt);
st[spt].push_back(p);
for (int j = i + 1; j < r; ++j) {
if (a[j] == y)
pu(s);
else
simple(a[j]);
}
pu(s);
st[s].clear();
id[x] = id[y] = 0;
id[p] = spt;
q.push(spt);
spt = s;
}
}
i = r;
}
printf("%d\n", (int)ans.size());
for (pii p : ans) {
if (p.second)
printf("2 %d %d\n", p.first, p.second);
else
printf("1 %d\n", p.first);
}
}
}
ok,代码看完了,看我在洛谷上的提交
2095洛谷的提交:
100分AC,对吧。
然后来看一本通上的提交:
2095一本通的提交:
蒙蔽的我……
接下来看2096
2096题目:
ok,来看我的代码。
2096代码:
#include <cstdio>
#include <iostream>
#include <vector>
#define ll long long
using namespace std;
const int N = 5e5 + 5, M = 2e6 + 5;
const ll mod = 1e9 + 7;
inline ll addmod(ll x, ll y) {return x + y >= mod ? x + y - mod : x + y;}
inline ll decmod(ll x, ll y) {return x - y < 0 ? x - y + mod : x - y;}
int n, m, tot[N];
ll pw[M], val[N], w[N], pre[N], suf[N], dp[N][2][2];
vector<int> G[N];
void init_pw(int n) {
pw[0] = 1;
for (int i = 1; i <= n; i++) pw[i] = pw[i - 1] * 2 % mod;
}
int cnt = 1, elst[N];
struct edge {
int to, nxt;
} e[M];
void add(int u, int v) {
e[++cnt].to = v;
e[cnt].nxt = elst[u];
elst[u] = cnt;
}
int tim, dc, dfn[N], low[N], dcc[N], siz[N];
int tp, stk[N];
void tarjan(int u, int from) {
dfn[u] = low[u] = ++tim;
stk[++tp] = u;
for (int i = elst[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!dfn[v]) tarjan(v, i), low[u] = min(low[u], low[v]);
else if (i != (from ^ 1)) low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]) {
dc++;
while (stk[tp] != u) {
dcc[stk[tp]] = dc;
siz[dc]++;
tp--;
}
dcc[stk[tp]] = dc;
siz[dc]++;
tp--;
}
}
void dfs(int u, int fa) {
if (G[u].size() == 1 && u > 1) {
dp[u][0][0] = dp[u][0][1] = w[u];
dp[u][1][0] = dp[u][1][1] = val[u];
return;
}
for (auto v : G[u]) {
if (v == fa) continue;
dfs(v, u);
}
ll s = 0, pro1 = val[u];
pre[0] = suf[G[u].size() + 1] = 1;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (v == fa) {pre[i + 1] = pre[i]; continue;}
pre[i + 1] = pre[i] * 2 % mod * dp[v][0][0] % mod;
}
for (int i = G[u].size() - 1; i >= 0; i--) {
int v = G[u][i];
if (v == fa) {suf[i + 1] = suf[i + 2]; continue;}
suf[i + 1] = suf[i + 2] * 2 % mod * dp[v][0][0] % mod;
}
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (v == fa) continue;
s = addmod(s, dp[v][1][0] * 2 % mod * pre[i] % mod * suf[i + 2] % mod);
s = decmod(s, dp[v][1][1] * pre[i] % mod * suf[i + 2] % mod);
}
dp[u][0][0] = dp[u][0][1] = dp[u][1][0] = dp[u][1][1] = w[u];
for (auto v : G[u]) {
if (v == fa) continue;
dp[u][0][0] = dp[u][0][0] * 2 % mod * dp[v][0][0] % mod;
dp[u][0][1] = dp[u][0][1] * 2 % mod * dp[v][0][1] % mod;
dp[u][1][0] = dp[u][1][0] * addmod(dp[v][0][1] * 2 % mod, dp[v][1][1]) % mod;
dp[u][1][1] = dp[u][1][1] * addmod(dp[v][0][1] * 2 % mod, dp[v][1][1]) % mod;
pro1 = pro1 * addmod(dp[v][0][1] * 2 % mod, dp[v][1][1]) % mod;
}
dp[u][1][0] = decmod(dp[u][1][0], dp[u][0][1]);
dp[u][1][0] = addmod(dp[u][1][0], s * w[u] % mod);
dp[u][1][1] = decmod(dp[u][1][1], dp[u][0][1]);
dp[u][1][0] = addmod(dp[u][1][0], pro1);
dp[u][1][1] = addmod(dp[u][1][1], pro1);
}
int main() {
scanf("%d %d", &n, &m);
init_pw(n + m);
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d %d", &u, &v);
add(u, v);
add(v, u);
}
if (n == 1) return puts("1"), 0;
tarjan(1, 0);
for (int i = 2; i <= cnt; i += 2) {
int u = e[i ^ 1].to, v = e[i].to;
if (dcc[u] != dcc[v]) G[dcc[u]].push_back(dcc[v]), G[dcc[v]].push_back(dcc[u]);
else tot[dcc[u]]++;
}
for (int i = 1; i <= dc; i++) val[i] = decmod(pw[siz[i] + tot[i]], pw[tot[i]]), w[i] = pw[tot[i]];
dfs(1, 0);
printf("%lld", dp[1][1][0]);
return 0;
}
ok,来看洛谷的提交
2096洛谷的提交:
又是AC,然后看一本通提交。
2096一本通的提交:
什么玩意!!!
总结:
啥玩意,一本通数据出问题了吧……