2023.3.26 小红书后端后两题题解

第二题:简单思维题

const int N = 100010;
int a[N];
int pos[N];
int n,k;
void solve()
{
    
    cin >> n >> k;
    for(int i=1;i<=n;++i){
        cin >> a[i];
        pos[a[i]] = i;
    }
    // 按照顺序判断2是否在1后面 如果不在可以把2,3,4...,k+1都放在最后
    int curr = 1;
    while(curr < n){
        int pos1 = pos[curr],pos2 = pos[curr + 1];
        if(pos2 < pos1){
            break;
        }
        curr ++;
    }
    int res = (n - curr + k - 1) / k;
    cout << res << endl;
}
int main()
{
    IOS;
    int _;
    cin >> _;
    while (_--)
    {
         solve();
    }
     return 0;
}

`

第三题:区间修改单点更新线段树+位运算性质(每一位开一颗线段树)

const int N = 100010,M = 100010;
int a[N];
int l[N],r[N];
int v[N];
string ops;
int n,m;

// 一共只有20位  或操作时只需要维护每一位上是否有1即可 如果赋值就被覆盖
// 与操作只需要判断是否与0即可

// 每次操作维护一个区间上的比特位上每一位的lazy
struct tnode
{
    int l,r;
    vector<int> bits;
    vector<int> lazy;
}tr[N << 2];
void build(int p,int l,int r){
    tr[p].l = l,tr[p].r = r;
    tr[p].bits.assign(20,0);
    tr[p].lazy.assign(20,-1);
    if(l == r){
        for(int i=0;i<19;++i){
            if(a[l] >> i & 1){
                tr[p].bits[i] = 1;
            }
        }
        return;
    }
    int mid = (l + r) >> 1;
    build(p << 1,l,mid);
    build(p << 1 | 1,mid + 1,r);
}
void pushdown(int p){
    for(int i=0;i<20;++i){
        if(tr[p].lazy[i] != -1){
            tr[p<<1].bits[i] = tr[p].lazy[i];
            tr[p<<1|1].bits[i] = tr[p].lazy[i];
            tr[p<<1].lazy[i] = tr[p].lazy[i];
            tr[p<<1|1].lazy[i] = tr[p].lazy[i];
            tr[p].lazy[i] = -1;
        }
    }
}
void update(int p,int l,int r,int val,int ops){
    if(l <= tr[p].l && r >= tr[p].r){
        // cout << tr[p].l << ":" << tr[p].r << ":" << l << ":" << r << ":" <<  val << endl;
        if(ops == 0){
            for(int i=0;i<20;++i){
                int bit = val >> i & 1;
                if(bit == 0){
                    tr[p].bits[i] = bit;
                    tr[p].lazy[i] = bit;
                }
            }
        }else if(ops == 1){
            for(int i=0;i<20;++i){
                int bit = val >> i & 1;
                if(bit == 1){
                    tr[p].bits[i] = bit;
                    tr[p].lazy[i] = bit;
                }
            }
        }else{
            for(int i=0;i<20;++i){
                int bit = val >> i & 1;
                tr[p].bits[i] = bit;
                tr[p].lazy[i] = bit;
            }
        }
        return;
    }

    pushdown(p);
    int mid = (tr[p].l + tr[p].r) >> 1;
    if(l <= mid){
        update(p<<1,l,r,val,ops);
    }
    if(r > mid){
        update(p<<1|1,l,r,val,ops);
    }
    return;
}
// 单点查询线段树
vector<int> query(int p,int x){
    if(x == tr[p].l && x == tr[p].r){
        return tr[p].bits;
    }
    pushdown(p);
    int mid = (tr[p].l + tr[p].r) >> 1;
    if(x <= mid){
        return query(p<<1,x);
    }else{
        return query(p<<1|1,x);
    }  
}

void solve()
{
    cin >> n;
    for(int i=1;i<=n;++i) cin >> a[i];

    build(1,1,n);

    cin >> m;
    for(int i=1;i<=m;++i){
        cin >> l[i];
    }
    for(int i=1;i<=m;++i){
        cin >> r[i];
    }
    cin >> ops;
    for(int i=1;i<=m;++i) cin >> v[i];
    
    for(int i=1;i<=m;++i){
        int left = l[i],right = r[i];
        int val = v[i];
        char op = ops[i-1];
        if(op == '&'){
            update(1,left,right,val,0);
        }else if(op == '|'){
            update(1,left,right,val,1);
        }else if(op == '='){
            update(1,left,right,val,2);
        }
    }

    for(int i=1;i<=n;++i){
        auto vec = query(1,i);
        int res = 0;
        for(int i=0;i<20;++i){
            if(vec[i] == 1){
                res += 1 << i;
            }
        }
        cout << res << " ";
    }
    cout << endl;
}

int main()
{
    IOS;
    int _ = 1;
    while (_--)
    {
         solve();
    }
    return 0;
}

全部评论
tql 呜呜 一题选手前来报到
1 回复 分享
发布于 2023-03-26 19:28 安徽
有解题思路就更好了!
点赞 回复 分享
发布于 2023-03-27 10:00 河南

相关推荐

Ncsbbss:又想干活又想要工资,怎么什么好事都让你占了
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
4
8
分享

创作者周榜

更多
牛客网
牛客企业服务