Codeforce962D(暴力优先队列)

本文介绍了一个名为MergeEquals的算法实现过程,该算法针对一个正整数数组进行操作,当数组中存在至少两个相等元素时,选取最小重复值x,移除左起第一个x,并将相邻的另一个x替换成两者的和,直至无法再执行此操作。文章通过C++代码展示了具体的实现细节。

Merge Equals

You are given an array of positive integers. While there are at least two equal elements, we will perform the following operation. We choose the smallest value x that occurs in the array 2or more times. Take the first two occurrences of x in this array (the two leftmost occurrences). Remove the left of these two occurrences, and the right one is replaced by the sum of this two values
Determine how the array will look after described operations are performed.

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
#define inf 1000000000
using namespace std;
typedef long long ll;
const int MAXN=1e9+10;
const int MAX=2e5+10;
const double eps=1e-6;

int n;
struct NODE{
    ll data,id;
    NODE(ll a,ll b):data(a),id(b){};
    NODE(){};
    friend operator<(NODE a,NODE b){
        if(a.data==b.data)
            return a.id>b.id;
        else
            return a.data>b.data;
    }
};

priority_queue<NODE>q;

int cmp(NODE a,NODE b){
    return a.id<b.id;
}

int main(){
    #ifdef ONLINE_JUDGE
    #else
    freopen("in.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    #endif
//cout<<"*"<<endl;

    cin>>n;
    ll t;
    for(ll i=1;i<=n;i++){
        scanf("%lld",&t);
        NODE temp(t,i);
        q.push(temp);
    }

    int cnt=0;
    NODE ans[MAX];
    while(q.size()){
        NODE a=q.top();q.pop();
        if(q.size()==0||a.data!=(q.top()).data){
            ans[cnt++]=a;
            continue;
        }
        NODE b=q.top();q.pop();
        //cout<<2*a.data<<endl;
        NODE temp(2*a.data,b.id);
        q.push(temp);
    }
    sort(ans,ans+cnt,cmp);
    cout<<cnt<<endl;
    for(int i=0;i<cnt;i++){
        cout<<ans[i].data<<" ";
    }cout<<endl;


    return 0;
}
### Codeforces 题目难度分布及评级标准 Codeforces 的题目难度范围广泛,涵盖了从新手到专家级别的各种挑战[^1]。该平台通过细致的分层机制来区分不同难度等级的问题,使得每位参赛者都能找到适合自己水平的任务。 #### 评分体系概述 Codeforces 使用基于积分制的评价系统,其中每道题都有一个对应的分数(rating),用于表示其相对难易程度。较低的 rating 表明这是一道较为简单的题目;而较高的 rating 则意味着更高的复杂性和解决难度。通常情况下: - **简单题**:Rating 小于等于 1200 分 - **中等偏难题**:Rating 范围大约在 1600 至 2000 分之间 - **困难题**:Rating 大于等于 2400 分 这些数值并不是固定的界限,而是根据社区反馈以及比赛实际情况调整的结果。 #### Divisions 和 Contest Types 为了更好地适应不同程度的学习者和技术爱好者的需求,Codeforces 提供了多种类型的竞赛活动,比如 Division 1, Division 2, Division 3 及 Division 4 等不同类型的比赛[^2]。每个 division 对应着不同的最低准入门槛——即参与者应该具备的基础能力或经验水平。例如,在更高级别的比赛中会遇到更多高难度的问题。 #### 技术领域覆盖 平台上发布的题目不仅限于单一的技术方向,还涉及到多个计算机科学的重要分支,如贪心算法、动态规划、图论等领域。这种多样性有助于全面锻炼编程技巧并促进跨学科思维的发展。 ```python # 示例 Python 代码片段展示如何获取某场比赛的信息 import requests def get_contest_info(contest_id): url = f"https://codeforces.com/api/contest.standings?contestId={contest_id}&from=1&count=1" response = requests.get(url).json() if 'result' not in response or 'problems' not in response['result']: return None problems = response['result']['problems'] for problem in problems: print(f"{problem['index']}: {problem['name']} - Rating: {problem.get('rating', 'N/A')}") get_contest_info(1669) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值