喵哈哈村的魔法考试 Round #2 (Div.2) 题解

本文解析了喵哈哈村编程竞赛的五道题目,包括村落战斗力比较、种花魔法实现、队伍排列优化、序列分析及数字识别挑战。提供了详细的算法思路与代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

喵哈哈村的魔法考试 Round #2 (Div.2) 题解

A.喵哈哈村的战争

题解:

这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了。

唯一的坑点,就是这道题会超过int。

不过好像,我的数据好像没有出超过int的数据= =

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int a,b;
    while(cin>>a>>b){
        long long sum1=0,sum2=0;
        while(a--){
            int temp;
            cin>>temp;
            sum1+=temp;
        }
        while(b--){
            int tem;
            cin>>tem;
            sum2+=tem;
        }
        if(sum1>sum2)cout<<"Win"<<endl;
        else cout<<"Lose"<<endl;
    }
}

B.喵哈哈村的种花魔法

题解:

这道题无脑一点,就是线段树的区间更新,然后单点查询就好了。

机智一点的话,就是单点更新,然后区间查询的题目,用一个前缀和去维护就好了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
long long a[maxn],b[maxn];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    for(int i=1;i<=m;i++){
        int l,r;
        long long val;
        scanf("%d%d%lld",&l,&r,&val);
        b[l]+=val;
        b[r+1]-=val;
    }
    long long sum = 0;
    for(int i=1;i<=n;i++){
        sum+=b[i];
        a[i]+=sum;
    }
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

C. 喵哈哈村的排队

一个无脑的做法:对于每个人进行二分,二分之后用线段树取区间最小值或者一个其他的数据结构去维护就好了。

但实际上有其他的做法:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define MAX 200002
using namespace std;

int a[MAX],ans[MAX];
vector<int> v,num;

int main()
{
    int n;
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        v.clear();
        num.clear();
        for(int i=n-1;i>=0;i--){
            if(v.size()==0 || v.back()>=a[i]){
                v.push_back(a[i]); num.push_back(i);
                ans[i]=-1;
            }else{
                int j = (lower_bound(v.rbegin(),v.rend(),a[i]) - v.rbegin());
                j = (int)v.size() - j - 1;
                ans[i] = num[j+1] - i - 1;
            }
        }
        for(int i=0;i<n;i++){
            if(i) printf(" ");
            printf("%d",ans[i]);
        }
        printf("\n");
    }
    return 0;
}

D. 喵哈哈村的序列

将a[i]在b数组中的位置记为c[i]

求c的最长上升子序列

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n,ans;
int v[50005],a[50005];
int best[50005];
int find(int x)
{
    int t=0,l=1,r=ans;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(best[mid]<x)l=mid+1,t=mid;
        else r=mid-1;   
    }
    return t;
}
void dp()
{
    memset(best,127/3,sizeof(best));
    best[0]=0;
    for(int i=1;i<=n;i++)
    {
        int t=find(v[i])+1;
        best[t]=min(best[t],v[i]);
        ans=max(ans,t);
    }
}
int main()
{
    //freopen("formation.in","r",stdin);
    //freopen("formation.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)a[read()]=i;
    for(int i=1;i<=n;i++)v[i]=a[read()];
    dp();
    printf("%d",ans);
    return 0;
}

E. 喵哈哈村的数字识别

这道题本意也不想让大家AC的,只要本地做出来就行了。

如果你不会这道题,你需要学一些机器学习的技巧,很多机器学习的知识都能解决这个问题。

比如KNN

### 关于Codeforces Round 704 Div. 2 的信息 对于Codeforces Round 704 Div. 2的比赛,虽然未直接提及具体题目解析或参赛体验的内容,但是可以根据平台的一贯风格推测该轮比赛同样包含了多种算法挑战。通常这类赛事会涉及数据结构、动态规划、图论等方面的知识。 考虑到提供的参考资料并未覆盖到此特定编号的比赛详情[^1],建议访问Codeforces官方网站查询官方题解或是浏览社区论坛获取其他选手分享的经验总结。一般而言,在赛后不久就会有详细的解答发布出来供学习交流之用。 为了帮助理解同类型的竞赛内容,这里提供了一个基于过往相似赛事的例子——如何通过居中子数组特性来解决问题的方法: ```cpp // 假设有一个函数用于处理给定条件下的数组恢复问题 vector<int> restoreArray(vector<vector<int>>& adjacentPairs) { unordered_map<int, vector<int>> adj; for (auto& p : adjacentPairs){ adj[p[0]].push_back(p[1]); adj[p[1]].push_back(p[0]); } int start = 0; for(auto& [num, neighbors] : adj){ if(neighbors.size() == 1){ start = num; break; } } vector<int> res(adjacentPairs.size() + 1); unordered_set<int> seen; function<void(int,int)> dfs = [&](int node, int idx){ seen.insert(node); res[idx] = node; for(auto next : adj[node]){ if(!seen.count(next)){ dfs(next, idx + 1); } } }; dfs(start, 0); return res; } ``` 上述代码展示了利用深度优先搜索(DFS)重建原始序列的一种方式,这某些情况下解决Codeforces比赛中遇到的问题思路相吻合[^4]。 #### 注意事项 由于缺乏针对Codeforces Round 704 Div. 2的具体材料支持,以上解释更多依赖于对同类活动的理解以及编程技巧的应用实例来进行说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值