求助
这道题怎么做# 队列增长
## 题目描述
有$n$个双端队列,所有队列只有一个初始元素,第$i$个队列的初始元素就是$i$。 \
接下来有$q$次操作,操作有三种:
- 1 a b:在第a个队列末尾加入元素b。
- 2 a b:在第a个队列开头加入元素b。
- 3 a b:把第b个队列拼到第a个队列后面。第b个队列直接消失,在后面的操作里不会再出现。(在这种操作中,数据保证$a \neq b$)
最后输出最长的队列的所有元素,从队头到队尾。如果有多个最长的队列,输出编号最小的那个。
## 输入格式
第一行输入两个整数$n$和$q$.
下面$q$行中每行输入三个整数,代表一组操作。含义见题目描述。
## 输出格式
输出一行,为最长队列的所有元素
## 样例 #1
### 样例输入 #1
```
2 3
1 1 2
2 2 3
3 1 2
```
### 样例输出 #1
```
1 2 3 2
```
## 提示
对于40%的数据,$n,q \le 10^3$.\
对于另外20%的数据,只有操作1和2。\
对于100%的数据,$n,q \le 10^6$,队列中的元素绝对值不超过$10^9$。
不是很明白题目 {:10_277:} {:10_277:} {:10_277:}
另外,建议:把 Markdown 格式改成普通格式,方便阅读 傻眼貓咪 发表于 2022-10-16 11:10
不是很明白题目
另外,建议:把 Markdown 格式改成普通格式,方便阅 ...
ok
本帖最后由 jhq999 于 2022-10-16 12:09 编辑
不知道我理解的对不对?只是按样例写的
#include<stdio.h>
void fun(int q,int *a,int *alen,int bval,int *b,int *blen)//q是表示第几个操作,a表示队列a,b表示队列b,bval表示元素b
{
switch(q)
{
case 1:
a[*alen]=bval;
*alen+=1;
break;
case 2:
for(int i=*alen;i>0;i-=1)
{
a=a;
}
a=bval;
*alen+=1;
break;
case 3:
for(int i=0;i<*blen;i+=1)
{
a[*alen+i]=b;
}
*alen+=*blen;
break;
default:
break;
}
}
/*
1 1 2
2 2 3
3 1 2
*/
void print(int *a,int l)
{
for(int i=0;i<l;i+=1)printf("%d",a);
}
int main(void)
{
int a1={0},a2={0},/*a3={0},*/l1=1,l2=1,/*l3=1,*/max=0,*m;
a1=1,a2=2/*,a3=3*/;
fun(1,a1,&l1,2,NULL,&l2);//在a后面加b
fun(2,a2,&l2,3,NULL,&l2);//在a前面加b
fun(3,a1,&l1,0,a2,&l2);//链接ab
max=l1;
m=a1;
if(max<l2)max=l2,m=a2;
//if(max<l3)max=l3,m=a3;
print(m,max);//输出最大
return 0;
}
页:
[1]