AtCoder Regular Contest 061
C - たくさんの数式 / Many Formulas
枚举加号所在的位置。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; typedef long long ll; ll ans; char s[11]; int n; void dfs(int p, ll t, ll x) { if (p == n + 1) return ans += t + x, void(); dfs(p + 1, t + x, s[p] - '0'); dfs(p + 1, t, x * 10 + s[p] - '0'); } int main() { scanf("%s", s + 1); n = strlen(s + 1); dfs(2, 0, s[1] - '0'); printf("%lld\n", ans); return 0; }
D - すぬけ君の塗り絵 / Snuke's Coloring
考虑每一次涂色所造成的影响。
#include<set> #include<bitset> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; inline char nc() { return getchar(); static char b[100000],*s=b,*t=b; return s==t&&(t=(s=b)+fread(b,1,100000,stdin),s==t)?-1:*s++; } inline void read(int &x) { char b = nc(); x = 0; for (; !isdigit(b); b = nc()); for (; isdigit(b); b = nc()) x = x * 10 + b - '0'; } int n, m, q; ll ans[10]; struct P { int x, y; inline bool operator<(const P &p) const { return x < p.x || (x == p.x && y < p.y); } inline bool operator==(const P &p) const { return x == p.x && y == p.y; } }; set < P > s; inline void upd(int x, int y) { if (x < 1 || y < 1 || x > n - 2 || y > m - 2) return; int t = 0; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) if (s.count((P){x + i, y + j})) ++t; ++ans[t]; --ans[t-1]; } int main() { read(n); read(m); read(q); ans[0] = (n - 2ll) * (m - 2); for (int x, y, k = 0; k < q; ++k) { read(x); read(y); s.insert((P){x, y}); for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) upd(x - i, y - j); } for (int i = 0; i < 10; ++i) printf("%lld\n", ans[i]); return 0; }
E - すぬけ君の地下鉄旅行 / Snuke's Subway Trip
拆点跑最短路。
#include<map> #include<queue> #include<cstdio> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> #define pb push_back #define mp make_pair #define fir first #define sec second using namespace std; inline char nc() { static char b[100000],*s=b,*t=b; return s==t&&(t=(s=b)+fread(b,1,100000,stdin),s==t)?-1:*s++; } inline void read(int &x) { char b = nc(); x = 0; for (; !isdigit(b); b = nc()); for (; isdigit(b); b = nc()) x = x * 10 + b - '0'; } int n, m, N; int dis[500005]; map < pair < int , int > , int > h; vector < pair < int , int > > g[500005]; bitset < 500005 > vis; priority_queue < pair < int , int > , vector < pair < int , int > > , greater < pair < int , int > > > q; inline void aE(int u, int v, int w) { g[u].pb(mp(v, w)); g[v].pb(mp(u, w)); } inline int idx(int u, int c) { return h.count(mp(u, c)) ? h[mp(u, c)] : h[mp(u, c)] = ++N; } int dijkstra() { memset(dis, 0x3f, sizeof(dis)); q.push(mp(dis[1] = 0, 1)); while (!q.empty()) { int u = q.top().sec; q.pop(); if (!vis[u]) for (int v, w, i = 0; i < g[u].size(); ++i) { v = g[u][i].fir, w = g[u][i].sec; if (!vis[v] && dis[v] > dis[u] + w) { dis[v] = dis[u] + w; q.push(mp(dis[v], v)); } } vis[u] = 1; } return dis[n] == 0x3f3f3f3f ? -1 : dis[n] / 2; } int main() { read(n); read(m); N = n; for (int u, v, c, a, b, i = 0; i < m; ++i) { read(u); read(v); read(c); a = idx(u, c); b = idx(v, c); aE(u, a, 1); aE(v, b, 1); aE(a, b, 0); } printf("%d\n", dijkstra()); return 0; }