Codeforces Round #411 (Div. 2) 题解

本文解析了五道算法竞赛题目,包括数论、字符串构造、图论、动态规划及贪心算法等方向,提供了清晰的思路和示例代码。

A:给定l和r,求[l,r]中的数的因数中出现次数最多的那一个 结论:如果l和r相同输出它 不然输出2

B:要求构造一个由abc组成的字符串 满足没有长度为3的回文子串的情况下c最少

发现只用ab构造出aabbaabbaabb….就能满足条件 c根本就用不到。

C:有n个点,从第i个点到第j个点的费用是(i+j) % (n+1) 求从任意点出发 到达所有点的最小费用

走法1->n->2->n-1->3->n-2…显然最优 输出(n-1)/2即可

D:给定一个由’a’和’b’组成的串 你要不断的把ab换成bba 直到没有ab 求换多少次,答案取模10^9+7

分析发现最后肯定变成bbb…bbbaaa…aaa的形式,所以不管怎么变步数应该是一样的。分析发现每个a能把他

后边的b变成2个b,而a要变的次数一定是后面b的个数,于是从后面开始处理,统计b的数量即可。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+7;
const int mod = 1e9+7;
char s[maxn];
int main()
{
    scanf("%s", s);
    int n=strlen(s);
    int cnt=0, ans = 0;;
    for(int i=n-1; i>=0; i--){
        if(s[i]=='b'){
            cnt++;
        }
        else{
            ans += cnt;
            cnt *= 2;
            cnt %= mod;
            ans %= mod;
        }
    }
    cout<<ans%mod<<endl;
}

E:

有一棵树,每个节点都有一些1-m的数字,个数和不超过5*10^5

要求你给1-m每个数字一个颜色 满足任意两个相同颜色的没有出现在同一个节点

保证1-m这些数字出现的位置构成原树的一个子图 n,m<=3*10^5

贪心DFS。因为这些数字都是连续的 所以假设一个数字在一个节点出现,却没在它的一个儿子节点出现,那么

它的那个儿子所在的子树一定没有它。

所以直接贪心即可 到达每一个节点的时候给这个节点上的数字中所有已经涂过的颜色打标记 然后给还没涂色

的涂尽量小的颜色。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+7;
set<int>s[maxn];
vector<int>G[maxn];
int n, m, cnt, ans[maxn];
void dfs(int x, int fa){
    vector<int>v;
    if(fa==-1){
        for(set<int>::iterator it = s[x].begin(); it != s[x].end(); it++){
            ans[(*it)]=++cnt;
        }
    }
    else{
        for(set<int>::iterator it = s[x].begin(); it != s[x].end(); it++){
            if(ans[(*it)]){
                v.push_back(ans[(*it)]);
            }
        }
        int sz=v.size();
        sort(v.begin(),v.end());
        int xx=0,yy=1;
        for(set<int>::iterator it = s[x].begin(); it != s[x].end(); it++){
            if(ans[(*it)]==0){
                while(xx<sz){
                    if(yy==v[xx]) xx++,yy++;
                    else break;
                }
                ans[*it]=yy++;
            }
            cnt=max(cnt,yy-1);
        }
    }
    for(int i = 0; i < G[x].size(); i++){
        int vv = G[x][i];
        if(vv == fa) continue;
        if(vv!=fa){
            dfs(vv, x);
        }
    }
}
int main()
{
    scanf("%d%d", &n,&m);
    for(int i=1; i<=n; i++){
        int x, y;
        scanf("%d", &x);
        while(x--){
            scanf("%d", &y);
            s[i].insert(y);
        }
    }
//    for(int i=1; i<=n; i++){
//        cout<<i<<":";
//        for(auto &it:s[i]){
//            cout<<it<<" ";
//        }
//        cout<<endl;
//    }
    for(int i=1; i<n; i++){
        int u, v;
        scanf("%d%d", &u,&v);
        G[u].push_back(v), G[v].push_back(u);
    }
    memset(ans, 0, sizeof(ans));
    cnt = 0;
    dfs(1, -1);
    cnt=max(cnt,1);
    printf("%d\n", cnt);
    for(int i=1; i<=m; i++) printf("%d ", ans[i]?ans[i]:1);
}

F:不会搞

一堆结论题真心可怕。

代码转载自:https://pan.quark.cn/s/7f503284aed9 Hibernate的核心组件总数达到五个,具体包括:Session、SessionFactory、Transaction、Query以及Configuration。 这五个核心组件在各类开发项目中都具有普遍的应用性。 借助这些组件,不仅可以高效地进行持久化对象的读取与存储,还能够实现事务管理功能。 接下来将通过图形化的方式,逐一阐述这五个核心组件的具体细节。 依据所提供的文件内容,可以总结出以下几个关键知识点:### 1. SSH框架详细架构图尽管标题提及“SSH框架详细架构图”,但在描述部分并未直接呈现关于SSH的详细内容,而是转向介绍了Hibernate的核心接口。 然而,在此我们可以简要概述SSH框架(涵盖Spring、Struts、Hibernate)的核心理念及其在Java开发中的具体作用。 #### Spring框架- **定义**:Spring框架是一个开源架构,其设计目标在于简化企业级应用的开发流程。 - **特点**: - **分层结构**:该框架允许开发者根据实际需求选择性地采纳部分组件,而非强制使用全部功能。 - **可复用性**:Spring框架支持创建可在不同开发环境中重复利用的业务逻辑和数据访问组件。 - **核心构成**: - **核心容器**:该部分包含了Spring框架的基础功能,其核心在于`BeanFactory`,该组件通过工厂模式运作,并借助控制反转(IoC)理念,将配置和依赖管理与具体的应用代码进行有效分离。 - **Spring上下文**:提供一个配置文件,其中整合了诸如JNDI、EJB、邮件服务、国际化支持等企业级服务。 - **Spring AO...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值