The 2021 ICPC Asia Regionals Online Contest (II)【解题报告】

信息技术挑战:操作序列与概率计算
这篇博客讨论了四个不同领域的算法问题:排序操作的有效性判断、数学极限计算、集合构造、动态概率分析以及二进制加法表示。通过实例解析和代码实现,展示了如何解决这些问题并利用特定的数据结构和技巧进行优化。

进入比赛


Problem A. Sort

题目大意

T T T 组,每组给出一个长度为 n n n 的序列 a [ ] a[] a[] 和 整数 k k k.

定义一次操作为将序列 a [ ] a[] a[] 分割成 v i v_i vi 段,再对段做置换 p i p_i pi.

若在有限次数操作中,无法使得序列 a [ ] a[] a[] 变成非降序,则输出 − 2 -2 2.

若在有限次数操作中,可以使得序列 a [ ] a[] a[] 变成非降序,且 ∑ v i ≤ 3 n \sum{v_i} \leq 3n vi3n,则输出方案,否则输出 − 1 -1 1.

1 ≤ T ≤ 1 0 3 , 1 ≤ k , n ≤ 1 0 3 , 1 ≤ a [ i ] ≤ 1 0 9 , ∑ n ≤ 3 × 1 0 4 1 \leq T \leq 10^3, 1 \leq k,n \leq 10^3,1 \leq a[i] \leq 10^9, \sum{n} \leq 3\times 10^4 1T103,1k,n103,1a[i]109,n3×104.

分析

不难发现,当 k ≥ 3 k \geq 3 k3 时,总可以构造出合法方案,就是一傻逼模拟题(被细节搞炸

k = 2 k=2 k=2 时,注意这个样例

2
3 2
1 2 1
2 1 2

代码实现

#include <bits/stdc++.h>
using namespace std;

const int M = (int)1e3;

int n, k;
int a[M + 5];
int b[M + 5];

bool is_sort(int p)
{
   
   
    for(int i = 1; i < n; ++i)
    {
   
   
        if(a[(i + p - 2) % n + 1] > a[(i + p - 1) % n + 1]) return 0;
    }
    return 1;
}

void work()
{
   
   
    scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    if(n == 1) printf("0\n");
    else if(k == 1)
    {
   
   
        if(is_sort(1)) printf("0\n");
        else           printf("-2\n");
    }
    else if(k == 2)
    {
   
   
        if(is_sort(1)) printf("0\n");
        else
        {
   
   
            for(int i = 1; i <= n; ++i)
            {
   
   
                if(is_sort(i))
                {
   
   
                    printf("1\n");
                    printf("2\n");
                    printf("%d %d %d\n", 0, i - 1, n);
                    printf("2 1\n");
                    for(int j = 1; j <= n; ++j) b[j] = a[j];
                    for(int j = 1; j <= n - i + 1; ++j) a[j] = b[j - 1 + i];
                    for(int j = n - i + 2; j <= n; ++j) a[j] = b[j - n + i - 1];
                    return;
                }
            }
            printf("-2\n");
        }
    }
    else if(k >= 3)
    {
   
   
        printf("%d\n", n - 1);
        for(int i = 1; i < n; ++i)
        {
   
   
            int p = i; for(int j = i; j <= n; ++j) if(a[p] > a[j]) p = j;
            if(i == p)
            {
   
   
                printf("2\n");
                printf("%d %d %d\n", 0, 1, n);
                printf("1 2\n");
            }
            else if(i == 1)
            {
   
   
                printf("2\n");
                printf("%d %d %d\n", 0, p - 1, n);
                printf("2 1\n");
                for(int j = 1; j <= n; ++j) b[j] = a[j];
                for(int j = 1; j <= n - p + 1; ++j) a[j] = b[j + p - 1];
                for(int j = n - p + 2; j <= n; ++j) a[j] = b[j - n + p - 1];
            }
            else
            {
   
   
                printf("3\n");
                printf("%d %d %d %d\n", 0, i - 1, p - 1, n);
                printf("1 3 2\n");
                for(int j = 1; j <= n; ++j) b[j] = a[j];
                for(int j = 1; j <= i - 1; ++j) a[j] = b[j];
                for(int j = i; j <= i + n - p; ++j) a[j] = b[j - i + p];
                for(int j = i + n - p + 1; j <= n; ++j) a[j] = b[j - n + p - 1];
            }
        }
    }
}

int main()
{
   
   
    int T; scanf("%d", &T);
    for(int ca = 1; ca <= T; ++ca)
    {
   
   
        work();
    }
    return 0;
}

Problem G. Limit

题目大意

给出 n , a i , b i , t n, a_i, b_i, t n,ai,bi,t,求 lim ⁡ x → 0 ∑ i = 1 n a i l n ( 1 + b i x ) x t \lim\limits_{x \rightarrow 0}{\frac{\sum_{i=1}^n{a_i ln(1+b_ix)}}{x^t}} x0limx

### 参与ICPC亚洲日本赛区线上第一轮比赛的信息和规则 #### 比赛概述 国际大学生程序设计竞赛(International Collegiate Programming Contest, ICPC)是一项全球性的编程竞赛活动。其中,ICPC亚洲区域赛分为多个赛区,包括中国、韩国以及日本等地的比赛。对于希望参加ICPC Asia Japan Online First-Round Contest的学生来说,了解具体的参赛信息至关重要。 #### 报名条件 通常情况下,只有在校本科生或者研究生可以组队报名参加此类赛事[^1]。每支队伍由三名队员组成,并且需要指定一名指导教师负责监督整个过程。需要注意的是,不同年份的具体规定可能会有所变化,因此建议关注官方发布的最新通知来获取最准确的要求。 #### 注册流程 为了能够顺利参与到比赛中去,团队应该尽早完成在线注册手续。这一般涉及到填写基本信息表格并提交给主办方审核通过之后才能正式成为参赛者之一。此外,在线平台还会提供练习环境供选手熟悉系统操作方式及其功能特性[^2]。 #### 赛事形式 该类竞赛多采用限时解题的形式来进行考核,即给出若干道算法题目让各小组在规定时间内解答尽可能多的问题以获得更高分数。期间允许查阅资料但严禁作弊行为的发生。值得注意的是,由于这是线上初选阶段,所以不存在现场答辩环节[^3]。 #### 准备工作 准备过程中除了要掌握扎实的数据结构与算法基础知识外,还应当注重培养良好的协作沟通能力以便于更好地发挥集体智慧解决问题。另外也可以参考往届真题集锦加深理解常见考点分布情况从而提高实战水平[^4]。 ```cpp // 示例代码用于展示如何处理输入输出流加速读取效率 #include<bits/stdc++.h> using namespace std; void solve(){ // 解决具体问题逻辑实现部分... } signed main(){ ios::sync_with_stdio(false); int T; cin >> T; while(T--)solve(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值