2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope

c++ list使用

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <time.h>
  6 #include <string>
  7 #include <set>
  8 #include <map>
  9 #include <list>
 10 #include <ext/rope>
 11 #include <stack>
 12 #include <queue>
 13 #include <vector>
 14 #include <bitset>
 15 #include <algorithm>
 16 #include <iostream>
 17 using namespace std;
 18 #define ll long long
 19 #define minv 1e-6
 20 #define inf 1e9
 21 #define pi 3.1415926536
 22 #define E  2.7182818284
 23 const ll mod=1e9+7;//998244353
 24 const int maxn=150010;
 25 using namespace __gnu_cxx;
 26
 27 char ch;
 28
 29 void read(int &x){
 30     ch = getchar();x = 0;
 31     for (; ch < ‘0‘ || ch > ‘9‘; ch = getchar());
 32     for (; ch >=‘0‘ && ch <= ‘9‘; ch = getchar()) x = x * 10 + ch - ‘0‘;
 33 }
 34
 35 list<int>f[maxn];
 36
 37 int main()
 38 {
 39     int n,q,mode,u,w,val,v,i;
 40     while (~scanf("%d%d",&n,&q))
 41     {
 42         for (i=1;i<=n;i++)
 43             f[i].clear();
 44         while (q--)
 45         {
 46             read(mode);
 47             if (mode==1)
 48             {
 49                 read(u),read(w),read(val);
 50                 if (w)
 51                     f[u].push_back(val);
 52                 else
 53                     f[u].push_front(val);
 54             }
 55             //2
 56             else if (mode==2)
 57             {
 58                 read(u),read(w);
 59                 if (f[u].empty())
 60                     printf("-1\n");
 61                 else
 62                 {
 63                     if (w)
 64                     {
 65                         printf("%d\n",f[u].back());
 66                         f[u].pop_back();
 67                     }
 68                     else
 69                     {
 70                         printf("%d\n",f[u].front());
 71                         f[u].pop_front();
 72                     }
 73                 }
 74             }
 75             //3
 76             else
 77             {
 78                 read(u),read(v),read(w);
 79                 if (w)
 80                     reverse(f[v].begin(),f[v].end());
 81                 f[u].splice(f[u].end(),f[v]);
 82
 83                 //or
 84
 85 //                if (w)
 86 //                    f[u].insert(f[u].end(),f[v].rbegin(),f[v].rend());
 87 //                else
 88 //                    f[u].insert(f[u].end(),f[v].begin(),f[v].end());
 89                 f[v].clear();
 90             }
 91         }
 92     }
 93     return 0;
 94 }
 95 /*
 96 2 30
 97 1 1 0 123
 98 1 1 0 1234
 99 1 2 1 2333
100 1 2 1 23333
101 1 2 1 233333
102 1 2 1 2333333
103 1 2 1 23333333
104 2 2 0
105 2 2 1
106 3 1 2 1
107 2 1 1
108 2 1 1
109 2 1 1
110 2 1 1
111 2 1 1
112 2 1 1
113 3 1 5 0
114 1 5 1 1
115 2 5 1
116 */

用rope超时了

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <time.h>
#include <string>
#include <set>
#include <map>
#include <list>
#include <ext/rope>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define minv 1e-6
#define inf 1e9
#define pi 3.1415926536
#define E  2.7182818284
const ll mod=1e9+7;//998244353
const int maxn=150010;
using namespace __gnu_cxx;

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‘;
}

rope<int>f[maxn],ff[maxn];

int main()
{
    int n,q,mode,u,w,val,v,i;
    while (~scanf("%d%d",&n,&q))
    {
        for (i=1;i<=n;i++)
            f[i].clear(),ff[i].clear();
        while (q--)
        {
            read(mode);
            if (mode==1)
            {
                read(u),read(w),read(val);
                if (w==1)
                {
                    f[u].push_back(val);
                    ff[u].insert(0,val);
                }
                else
                {
                    f[u].insert(0,val);
                    ff[u].push_back(val);
                }
            }
            else if (mode==2)
            {
                read(u),read(w);
                if (f[u].empty())
                    printf("-1\n");
                else
                {
                    if (w==1)
                    {
                        printf("%d\n",f[u].at(f[u].size()-1));
                        f[u].erase(f[u].size()-1,1);
                        ff[u].erase(0,1);
                    }
                    else
                    {
                        printf("%d\n",f[u].at(0));
                        f[u].erase(0,1);
                        ff[u].erase(f[u].size()-1,1);
                    }
                }
            }
            else
            {
                read(u),read(v),read(w);
                if (w==0)
                {
                    f[u].append(f[v]);
                    ff[u]=ff[v]+ff[u];
                    f[v].clear();
                    ff[v].clear();
                }
                else
                {
                    f[u].append(ff[v]);
                    ff[u]=f[v]+ff[u];
                    f[v].clear();
                    ff[v].clear();
                }
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/cmyg/p/9516619.html

时间: 2024-11-08 08:34:22

2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope的相关文章

2018 “百度之星”程序设计大赛 - 初赛(A)

第二题还算手稳+手快?最后勉强挤进前五百(期间看着自己从两百多掉到494名) 1001  度度熊拼三角    (hdoj 6374) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6374 签到题 题意:给n根木棒 求可以拼出的周长最长的三角形 可以用贪心的思想做 对所有的木棒长度进行排序 取最长的三根进行判断是否可以组成三角形 若不能 舍去最长的一根 每次都选择相邻的三根 for一遍就好 复杂度为O(nlogn) 代码如下 #include <ios

2018 “百度之星”程序设计大赛 - 初赛(A)1004 / hdu6377 度度熊看球赛 dp递推

度度熊看球赛 Problem Description 世界杯正如火如荼地开展!度度熊来到了一家酒吧. 有 N 对情侣相约一起看世界杯,荧幕前正好有 2×N 个横排的位置. 所有人都会随机坐在某个位置上. 当然,如果某一对情侣正好挨着坐,他们就会有说不完的话,影响世界杯的观看. 一般地,对于一个就座方案,如果正好有 K 对情侣正好是挨着坐的,就会产生 DK 的喧闹值. 度度熊想知道随机就座方案的期望喧闹值. 为了避免输出实数,设答案为 ans,请输出 ans×(2N)! mod P 的值.其中 P

2018 “百度之星”程序设计大赛 - 初赛(B)

degree Accepts: 1581 Submissions: 3494 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description 度度熊最近似乎在研究图论.给定一个有 NN 个点 (vertex) 以及 MM 条边 (edge) 的无向简单图 (undirected simple graph),此图中保证没有任何圈 (cycle) 存在. 现在

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

2014年百度之星程序设计大赛 - 初赛(第二轮)

1001 暴力 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 100100; int ll[maxn], rr[maxn]; struct node { int x, y, bj; }e[maxn]; int main() { int cas = 1; int T; scanf("%d", &T);

2014年百度之星程序设计大赛 - 初赛(第二轮)Chess

题目描述:小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.也就是说,如果"王"当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2) 这八个点中的任意一个. 小度觉得每次都是小良赢,没意思.为了难倒小良,他想出

2017&quot;百度之星&quot;程序设计大赛 - 初赛(A)

2017"百度之星"程序设计大赛 - 初赛(A) hdu6108    求出 n-1 的因子个数即可 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b;

HDU 6114 Chess 【组合数】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 513    Accepted Submission(s): 319 Problem Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻

HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1572    Accepted Submission(s): 513 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是