张育玮 发表于 2022-10-16 10:30:54

求助

这道题怎么做



# 队列增长

## 题目描述

有$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$。


傻眼貓咪 发表于 2022-10-16 11:10:28

不是很明白题目 {:10_277:} {:10_277:} {:10_277:}

另外,建议:把 Markdown 格式改成普通格式,方便阅读

张育玮 发表于 2022-10-16 11:28:01

傻眼貓咪 发表于 2022-10-16 11:10
不是很明白题目   

另外,建议:把 Markdown 格式改成普通格式,方便阅 ...

ok

jhq999 发表于 2022-10-16 12:00:12

本帖最后由 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]
查看完整版本: 求助