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

 

posted @ 2017-12-20 11:58  p0ny  阅读(191)  评论(0编辑  收藏  举报