打卡信奥刷题(2111)用C++实现信奥 P11890 [XRCOI Round 1] A. 相聚相逢本无意

P11890 [XRCOI Round 1] A. 相聚相逢本无意

题目背景

花开花落终有时,相聚相逢本无意。

题目描述

初见时,她给了小 S 一个可以为空的序列 AAA,长度为 nnn

她定义了序列的前缀 MEX 序列 BBB,满足 BBB 的第 iii 项为 MEX{A1,A2,…,Ai}\text{MEX}\{A_1,A_2,\dots,A_i\}MEX{A1,A2,,Ai},对于一个由有限个非负整数组成的数列 XXX,我们定义 MEX\text{MEX}MEX 为数列中不包含的最小非负整数。比如 MEX{1,2,3}=0,MEX{0,1,2,4}=3\text{MEX}\{1,2,3\}=0,\text{MEX}\{0,1,2,4\}=3MEX{1,2,3}=0,MEX{0,1,2,4}=3

作为初见时的考验,小 S 需要构造一个单调不降AAA 数组,使得其前缀 MEX\text{MEX}MEX 数组 BBB 满足一些约束。或者判定没有任何一种符合要求的 AAA 存在。

具体的,BBB 数组需要满足的限制形如 kkk 个二元组 (x,y)(x,y)(x,y),表示数 xxxBBB恰好出现了 yyy 次。

不需要最小化构造的 AAA 数组的大小或者使构造满足其它没有给定的额外条件。

小 S 不会这个问题,所以他请你来帮忙了。

输入格式

第一行一个非负整数 kkk,表示构造的 AAA 需要满足的二元组的个数。

接下来 kkk 行,每行 222 个非负整数,表示一个二元组 (x,y)(x,y)(x,y)

输出格式

如果不存在合法情况,输出一行一个数 −1-11

否则输出两行:

第一行一个整数 nnn,为你构造的序列 AAA 的长度,需满足 0≤n≤2×1050\le n\le 2\times 10^50n2×105

第二行 nnn 个正整数,为你构造的序列 AAA 的元素,需满足 0≤Ai≤1090\le A_i\le 10^90Ai109∀i∈[1,n−1],Ai≤Ai+1\forall i\in[1,n-1],A_i\le A_{i+1}i[1,n1],AiAi+1

输入输出样例 #1

输入 #1

4
1 1
3 1
2 3
4 1

输出 #1

6
0 1 1 1 2 3

输入输出样例 #2

输入 #2

4
1 1
3 0
2 3
4 1

输出 #2

-1

说明/提示

样例解释

第一个样例中,构造出来的 B=(1,2,2,2,3,4)B=(1,2,2,2,3,4)B=(1,2,2,2,3,4), 符合以上 kkk 个二元组的要求。

更详细的,有:

B1=MEX{A1}=MEX{0}=1B_1=\text{MEX}\{A_1\}=\text{MEX}\{0\}=1B1=MEX{A1}=MEX{0}=1

B2=MEX{A1,A2}=MEX{0,1}=2B_2=\text{MEX}\{A_1,A_2\}=\text{MEX}\{0,1\}=2B2=MEX{A1,A2}=MEX{0,1}=2

B3=MEX{A1,A2,A3}=MEX{0,1}=2B_3=\text{MEX}\{A_1,A_2,A_3\}=\text{MEX}\{0,1\}=2B3=MEX{A1,A2,A3}=MEX{0,1}=2

B4=MEX{A1,A2,A3,A4}=MEX{0,1}=2B_4=\text{MEX}\{A_1,A_2,A_3,A_4\}=\text{MEX}\{0,1\}=2B4=MEX{A1,A2,A3,A4}=MEX{0,1}=2

B5=MEX{A1,A2,A3,A4,A5}=MEX{0,1,2}=3B_5=\text{MEX}\{A_1,A_2,A_3,A_4,A_5\}=\text{MEX}\{0,1,2\}=3B5=MEX{A1,A2,A3,A4,A5}=MEX{0,1,2}=3

B6=MEX{A1,A2,A3,A4,A5,A6}=MEX{0,1,2,3}=4B_6=\text{MEX}\{A_1,A_2,A_3,A_4,A_5,A_6\}=\text{MEX}\{0,1,2,3\}=4B6=MEX{A1,A2,A3,A4,A5,A6}=MEX{0,1,2,3}=4

第二个样例中,可以证明没有任何一个 AAA 满足要求。

数据规模与约定

本题采用捆绑测试和子任务依赖并开启 Special Judge。

你可以输出任意一组满足条件的情况,如果不存在合法情况输出 −1-11

其中子任务 000 为样例,记 000 分。

子任务编号分值特殊性质子任务依赖
111303030x≠0,y≠0x\not=0,y\not=0x=0,y=0
222303030x≠0x\not=0x=0111
333303030y≠0y\not=0y=0111
444101010无特殊性质1,2,31,2,31,2,3

对于 100%100 \%100% 的数据,保证 0≤k,x,y≤1000\le k,x,y\le 1000k,x,y100,且给出的二元组中 xxx 两两不同。

不保证 xxx 单调递增。

C++实现

#include<iostream>
using namespace std;
int k,s[102],n,a[200005],mxd;
bool p,b;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>k;
    for(int i=0;i<=100;i++)s[i]=1;//初始化
    while(k--){
        int x;
        cin>>x;
        if(!x)p=1;
        cin>>s[x];
        if(s[x])b=1,mxd=max(mxd,x);
    }
    if(!b){//1
        cout<<0;
        return 0;
    }
    if(p&&s[0]){//2
        if(!mxd){//3
            cout<<s[0]<<'\n';
            while(s[0]--)cout<<1<<' ';
        }
        else cout<<-1;
        return 0;
    }
    for(int i=0;i<mxd;i++){
        if(i&&!s[i]){//4
            cout<<-1;
            return 0;
        }
        for(int j=0;j<s[i+1];j++)a[++n]=i;//5
    }
    cout<<n<<'\n';
    for(int i=1;i<=n;i++)cout<<a[i]<<' ';
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值