zoukankan      html  css  js  c++  java
  • Codeforces Round #460 (Div. 2)

    A

    签到


    B

    题意

    定义:一个数(没有前缀0)的各个位数之和为10位“perfec”数,问第k个“perfect”数位多少(1<=k<=1e5)

    分析

    一开始找错了,以为会超过1e9,通过理性的分析不难发现,最大不超过1e9,强行打个表即可


    C

    签到


    D

    题意

    n个点m条边的有向图,每个点有一个数字(可以重复,0~25),定义一条路径的权值为该路径出现数字最多的数字的次数,若有环输出-1,否则输出最大值(1 ≤ n, m ≤ 300 000)

    分析

    思路:首先直接dfs肯定不行,最坏情况n^2,

              问题就在于:如何记忆的记录已经搜索的路的每个数字的次数

             解决:dp思想,每个点记录下到改点的所有数字的次数即可

    正解:拓扑排序+dp

    拓扑排序的时候dp即可

    定义:dp[i][j]:第i个点数字j的最大值

    转移 :直接从上一个节点到当前节点转移即可

    时间复杂度(26*m)

    #include<bits/stdc++.h>
    #define ll long long
    
    using namespace std;
    
    const int maxn = 300000+2;
    
    
    int num[maxn];
    struct node
    {
        int to,next;
    
    }edge[maxn];
    int cnt;
    int head[maxn];
    
    void addedge(int u, int v)
    {
        ++cnt;
        edge[cnt].to=v;
        edge[cnt].next=head[u];
        head[u]=cnt;
    }
    
    bool flag;
    int n, m;
    string s;
    int dp[maxn][26];
    int answer=0;
    queue<int>q;
    int deep[maxn];
    
    void topsort()
    {
        int ans=0;
        while(!q.empty())
        {
            ans++;
            int now=q.front();
            q.pop();
            for(int i=head[now];i!=0;i=edge[i].next)
            {
                int v=edge[i].to;
                deep[v]--;
                if(!deep[v])
                    q.push(v);
                 for(int j=0;j<26;j++)
                 {
                     if(j==num[v])
                        dp[v][j]=max(dp[v][j],dp[now][j]+1);
                     else
                        dp[v][j]=max(dp[v][j],dp[now][j]);
                    answer=max(answer, dp[v][j]);
                 }
    
            }
        }
        if(ans<n)
            flag=false;
    
    }
    
    int main()
    {
        flag=true;
        scanf("%d%d", &n, &m);
        cin>>s;
        for(int i=0;i<n;i++)
        {
            num[i+1]=s[i]-'a';
        }
        int u,v;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d", &u, &v);
            addedge(u,v);
            deep[v]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(deep[i]==0)
            {
                  q.push(i);
                  dp[i][num[i]]++;
            }
        }
        topsort();
        if(!flag)
            printf("-1
    ");
        else
            printf("%d
    ", answer);
        return 0;
    }
    View Code

    E

    题意

    n*a^n = b (mod p)  (1<=n<=x),给出a,b,x,p(p为素数),问满足上式的n的个数 (2 ≤ p ≤ 106 + 3, 1 ≤ a, b < p1 ≤ x ≤ 1012)

    分析

    费马小定理应用

     

  • 相关阅读:
    ZooKeeper学习第一期---Zookeeper简单介绍
    安装zookeeper(单机,伪集群)
    一张图看懂DNS域名解析全过程
    CDN基本工作过程
    第十七章、程序管理与 SELinux 初探
    直方图均衡化的缺点——不平坦
    电感耦合等离子体质谱法响应时间
    C++内容记录
    图像质量评价-NQM和WPSNR
    分颜色通道SR的相关论文
  • 原文地址:https://www.cnblogs.com/Superwalker/p/8407712.html
Copyright © 2011-2022 走看看