2021杭电多校第九场 1007——Boring data structure problem

题目大意

题如其名
有一个双端队列,进行 n n n 次操作,有四种操作
L : L: L:在队首插入一个数 t o t tot tot
R : R: R:在队尾插入一个数 t o t tot tot
G x G x Gx删除队列中的数 x x x
Q : Q: Q:问你队列中最中间的数是什么

解题思路

用数组模拟链表,数据有 1 e 7 1e7 1e7,可能接受不了很大的常数,我们需要开5个数组
m p : mp: mp:用来映射数的下标
l : l: l:前一个数的下标
r : r: r:后一个数的下标
a c c : acc: acc:在最中间的数的左侧还是右侧
l s : ls: ls:存数的数组
模拟一下就可以了

Code

#include <bits/stdc++.h>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
using namespace std;
const int MAXN = 1e7 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int ls[MAXN], l[MAXN], r[MAXN], mp[MAXN], acc[MAXN];
void solve(){
    int n;
    int pmid = 0;
    scanf("%d",&n);
    int lp = 0, rp = 0;
    int cnt = 0;
    int idx = 1;
    int num = 0;
    while(n--){
        char c[2];
        scanf("%s",c);
        if(c[0] == 'L'){
            ls[++cnt] = idx;
            mp[idx] = cnt;
            idx++;
            num++;
            if(num == 1){
                lp = rp = cnt;
                l[cnt] = r[cnt] = 0;
                pmid = cnt;
                acc[cnt] = -2;
            }
            else{
                r[cnt] = lp;
                l[lp] = cnt;
                lp = cnt;
                if(num&1){
                    acc[pmid] = 1;
                    pmid = l[pmid];
                    acc[pmid] = -2;
                }
                acc[cnt] = -1;
            }
        }
        else if(c[0] == 'R'){
            ls[++cnt] = idx;
            mp[idx] = cnt;
            idx++;
            num++;
            if(num == 1){
                lp = rp = cnt;
                l[cnt] = r[cnt] = 0;
                pmid = cnt;
                acc[pmid] = -2;
            }
            else{
                l[cnt] = rp;
                r[rp] = cnt;
                rp = cnt;
                if(num % 2 == 0){
                    acc[pmid] = -1;
                    pmid = r[pmid];
                    acc[pmid] = -2;
                }
                    acc[cnt] = 1;
            }
        }
        else if(c[0] == 'G'){
            int x;
            scanf("%d",&x);
            int k = mp[x];
            if(acc[k] == -2){
                if(num&1){
                    pmid = r[k];
                    acc[r[k]] = -2;
                }
                else{
                    pmid = l[k];
                    acc[l[k]] = -2;
                }
                if(k == lp){
                    lp = r[lp];
                }
                else if(k == rp){
                    rp = l[rp];
                }
                r[l[k]] = r[k];
                l[r[k]] = l[k];
                l[k] = 0;
                r[k] = 0;
                num--;
            }
            else if(acc[k] == -1){
                if(k == lp){
                    lp = r[lp];
                }
                if(num&1){
                    acc[pmid] = -1;
                    pmid = r[pmid];
                    acc[pmid] = -2;
                    r[l[k]] = r[k];
                    l[r[k]] = l[k];
                    l[k] = 0;
                    r[k] = 0;
                }
                else{
                    r[l[k]] = r[k];
                    l[r[k]] = l[k];
                    l[k] = 0;
                    r[k] = 0;
                }
                num--;
            }
            else if(acc[k] == 1){
                if(k == rp) rp = l[rp];
                if(num&1){
                    r[l[k]] = r[k];
                    l[r[k]] = l[k];
                    l[k] = 0;
                    r[k] = 0;
                }
                else{
                    acc[pmid] = 1;
                    pmid = l[pmid];
                    acc[pmid] = -2;
                    r[l[k]] = r[k];
                    l[r[k]] = l[k];
                    l[k] = 0;
                    r[k] = 0;
                }
                num--;
            }
        }
        else{
            printf("%d\n",ls[pmid]);
        }
    }
}

int main()
{
    #ifdef ONLINE_JUDGE
    #else
       freopen("in.txt", "r", stdin);
       freopen("out.txt", "w", stdout);
    #endif

    // qc;
    int T;
    // cin >> T;
    T = 1;
    while(T--){

        solve();
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要在 BoringSSL 中设置随机数,你可以使用 `RAND_set_rand_method` 函数来设置随机数生成器的实现。这个函数需要一个指向 `RAND_METHOD` 结构体的指针,这个结构体包含了用于生成、清除和添加随机数种子的函数。你可以使用 BoringSSL 提供的默认实现,也可以自己实现这个结构体来提供自定义的随机数生成方式。 示例代码如下: ``` #include <openssl/rand.h> RAND_METHOD fake_rand_method; int fake_rand_bytes(unsigned char *buf, int num) { // 在这里实现生成 num 个字节的随机数的逻辑 return 1; } void fake_rand_cleanup(void) { // 在这里实现清除随机数种子的逻辑 } int fake_rand_add(const void *buf, int num, double entropy) { // 在这里实现添加随机数种子的逻辑 return 1; } int fake_rand_status(void) { // 在这里实现返回随机数生成器的状态的逻辑 return 1; } int main() { fake_rand_method.bytes = fake_rand_bytes; fake_rand_method.cleanup = fake_rand_cleanup; fake_rand_method.add = fake_rand_add; fake_rand_method.status = fake_rand_status; RAND_set_rand_method(&fake_rand_method); // 现在 BoringSSL 会使用 fake_rand_method 中定义的函数来生成随机数 return 0; } ``` 注意,如果你使用的是 BoringSSL 的 C++ 封装(也就是 `boringssl::RAND` 类),那么你可以 ### 回答2: boringssl是一个用于加密和安全传输的开源软件库,其随机数的设置是非常重要的。 在boringssl中,可以通过以下步骤来设置随机数: 1. 初始化随机数引擎:首先,需要使用一个随机数引擎来生成随机数。boringssl使用Crypto::Rand类来生成随机数,可以通过调用Crypto::Rand::Init()函数来初始化随机数引擎。 2. 获取随机数:一旦随机数引擎被初始化,可以使用Crypto::Rand::Bytes()函数来获取指定长度的随机数。该函数将生成的随机数存储在指定的内存位置中。 3. 设置随机数回调函数:为了更好地控制随机数的生成过程,boringssl还提供了设置随机数回调函数的功能。可以通过调用CRYPTO_set_rand_bytes_callback()函数来设置随机数回调函数,该函数接受一个函数指针作为参数,用于指定随机数的生成方式。 通过以上步骤,可以在boringssl中设置随机数。这样做是为了确保加密算法中使用的随机数具有足够的随机性和安全性,以提高加密和安全传输的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值