zoukankan      html  css  js  c++  java
  • C语言编程练习46:度度熊学队列

    度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣。 

    初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作。 

    ①1 u w val 在编号为 u 的队列里加入一个权值为 val 的元素。(w=0 表示加在最前面,w=1 表示加在最后面)。 

    ②2 u w 询问编号为 u 的队列里的某个元素并删除它。( w=0 表示询问并操作最前面的元素,w=1 表示最后面) 

    ③3 u v w 把编号为 v 的队列“接在”编号为 u 的队列的最后面。w=0表示顺序接(队列 v 的开头和队列 u 的结尾连在一起,队列v 的结尾作为新队列的结尾), w=1 表示逆序接(先将队列 v 翻转,再顺序接在队列 u 后面)。且该操作完成后,队列 v 被清空。

    Input

    有多组数据。 

    对于每一组数据,第一行读入两个数 N 和 Q。 

    接下来有 Q 行,每行 3~4 个数,意义如上。 

    N≤150000,Q≤400000

    1≤u,v≤N,0≤w≤1,1≤val≤100000

    所有数据里 QQ 的和不超过500000

    Output

    对于每组数据的每一个操作②,输出一行表示答案。 

    注意,如果操作②的队列是空的,就输出−1−1且不执行删除操作。

    Sample Input

    2 10
    1 1 1 23
    1 1 0 233
    2 1 1 
    1 2 1 2333
    1 2 1 23333
    3 1 2 1
    2 2 0
    2 1 1
    2 1 0
    2 1 1
    Sample Output
    23
    -1
    2333
    233
    23333
    
    提示
    
    由于读入过大,C/C++ 选手建议使用读入优化。
    
    一个简单的例子:
    
    void read(int &x){
    	char ch = getchar();x = 0;
    	for (; ch < '0' || ch > '9'; ch = getchar());
    	for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    }

    双端队列的使用
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <deque>
    using namespace std;
    
    
    int main()
    {
        int n,q;
        while(scanf("%d%d",&n,&q)!=EOF)
        {
            deque<int >que[n+1];
            for(int pp=1;pp<=q;pp++)
            {
                int a,u,w;
                scanf("%d%d%d",&a,&u,&w);
                if(a==1)
                {
                    int x;
                    scanf("%d",&x);
                    if(w==0)
                    {
                        que[u].push_front(x);
                    }
                    else
                    {
                        que[u].push_back(x);
                    }
                }
                else if(a==2)
                {
                    if(!que[u].empty())
                    {
                        if(w==1)
                        {
                            printf("%d
    ",que[u][que[u].size()-1]);
                            que[u].pop_back();
                        }
                        else
                        {
                            printf("%d
    ",que[u][0]);
                            que[u].pop_front();
                        }
                        
                    }
                    else
                    {
                        printf("-1
    ");
                    }
                }
                else
                {
                    int v;
                    v=w;
                    scanf("%d",&w);
                    if(w==1&&que[v].size()>=2)
                    {
                        reverse(que[v].begin(),que[v].end());
                    }
                    while (!que[v].empty())
                    {
                        que[u].push_back(que[v][0]);
                        que[v].pop_front();
                    }
                    
    
                }
                
            }
        }
       
       return 0;
    }
    
  • 相关阅读:
    全站之路一路坑(3)——使用百度站长工具提交站点地图
    全站之路一路坑(2)——在Apache下部署django博客
    全栈一路坑之使用django创建博客
    Django添加模型无法数据迁移解决方法
    一款自动汇报工作的微信机器人
    微信js接口自定义分享内容
    C Primer
    皇家每羊历险记(四)——角色移动
    【转载】Spring Boot 使用SSL-HTTPS
    解决https负载报错:unable to find valid certification path to requested target
  • 原文地址:https://www.cnblogs.com/FantasticDoubleFish/p/14373226.html
Copyright © 2011-2022 走看看