ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1209F - Koala and Notebook

2019-09-18 23:55:01  阅读:196  来源: 互联网

标签:arr Koala int lst Notebook MAXN 1209F now bak


这场比赛没打,看同学fst了,于是来看看。

这道题看似简单,但是没想清楚细节真的不太行。像现在熬到十一点左右,脑子真的不行。

首先显然位数越小越好,因为每一位要比较,不如拆点。此时要拆成两条有向链(开始实现成了无向链)

然后这个时候就可以很方便地跑最短路了。但是细节比较多。

首先直接贪心走最小边然后bfs是不行的,所以要考虑分层(这里也挂了)。对于每一个点伸出去边长相等的属于一个等价类。此时容易证明等价类数量是 \(O(m)\) 的。

于是直接分层跑即可。由字典序从小到大枚举等价类,易知更新时不断在等价类列表尾插入一个新的点是对的。

这道题就这两个难点,于是作为低水平选手两处都被坑到了。

#include <bits/stdc++.h>

const int mod = 1000000007;
const int MAXN = 1100010;
std::vector<int> G[MAXN][10], qs[MAXN];
void addedge(int b, int e, int v) {
    G[b][v].push_back(e);
}
int n, m, idx, dp[MAXN];
bool vis[MAXN];
int main() {
    std::ios_base::sync_with_stdio(false), std::cin.tie(0);
    std::cin >> n >> m; idx = n;
    for (int i = 1; i <= m; ++i) {
        int t1, t2; std::cin >> t1 >> t2;
        static int arr[10], bak; bak = 0;
        int t = i;
        while (t) arr[bak++] = t % 10, t /= 10;
        int lst = t1;
        for (int j = bak - 1; ~j; --j) {
            int now = j ? ++idx : t2;
            addedge(lst, now, arr[j]);
            lst = now;
        }
        for (int j = bak - 1; ~j; --j) {
            int now = j ? ++idx : t1;
            addedge(lst, now, arr[j]);
            lst = now;
        }
    }
    int T;
    qs[T = 1].push_back(1); vis[1] = true;
    for (int P = 1; P <= T; ++P) {
        for (int j = 0; j != 10; ++j) {
            bool flg = false;
            for (auto t : qs[P]) {
                for (auto v : G[t][j]) {
                    if (vis[v]) continue;
                    vis[v] = true;
                    dp[v] = (dp[t] * 10ll + j) % mod;
                    qs[T + 1].push_back(v);
                    flg = true;
                }
            }
            if (flg) ++T;
        }
    }
    for (int i = 2; i <= n; ++i)
        std::cout << dp[i] << '\n';
    return 0;
}

标签:arr,Koala,int,lst,Notebook,MAXN,1209F,now,bak
来源: https://www.cnblogs.com/daklqw/p/11546379.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有