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),表示数 xxx 在 BBB 中恰好出现了 yyy 次。
不需要最小化构造的 AAA 数组的大小或者使构造满足其它没有给定的额外条件。
小 S 不会这个问题,所以他请你来帮忙了。
输入格式
第一行一个非负整数 kkk,表示构造的 AAA 需要满足的二元组的个数。
接下来 kkk 行,每行 222 个非负整数,表示一个二元组 (x,y)(x,y)(x,y)。
输出格式
如果不存在合法情况,输出一行一个数 −1-1−1。
否则输出两行:
第一行一个整数 nnn,为你构造的序列 AAA 的长度,需满足 0≤n≤2×1050\le n\le 2\times 10^50≤n≤2×105。
第二行 nnn 个正整数,为你构造的序列 AAA 的元素,需满足 0≤Ai≤1090\le A_i\le 10^90≤Ai≤109 且 ∀i∈[1,n−1],Ai≤Ai+1\forall i\in[1,n-1],A_i\le A_{i+1}∀i∈[1,n−1],Ai≤Ai+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-1−1。
其中子任务 000 为样例,记 000 分。
| 子任务编号 | 分值 | 特殊性质 | 子任务依赖 |
|---|---|---|---|
| 111 | 303030 | x≠0,y≠0x\not=0,y\not=0x=0,y=0 | 无 |
| 222 | 303030 | x≠0x\not=0x=0 | 111 |
| 333 | 303030 | y≠0y\not=0y=0 | 111 |
| 444 | 101010 | 无特殊性质 | 1,2,31,2,31,2,3 |
对于 100%100 \%100% 的数据,保证 0≤k,x,y≤1000\le k,x,y\le 1000≤k,x,y≤100,且给出的二元组中 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P11890 XRCOI Round 1 A. 相聚相逢本无意&spm=1001.2101.3001.5002&articleId=152114623&d=1&t=3&u=e1bd784af8824784877b333508dfad3b)
713

被折叠的 条评论
为什么被折叠?



