9.22字节跳动笔试

第4题,离散化后权值线段树。

#define IO std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define bug(x) cout<<#x<<" is "<<x<<endl
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define rs o * 2 + 1
#define ls o * 2
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
int n;
int a[N];
int b[N];
ll d[N * 4];
void up(int o, int l, int r, int pos, int val){
    if(l == r){
        d[o] = (d[o] + val) % mod;
        return;
    }
    int m = (l + r) / 2;
    if(pos <= m) up(ls, l, m, pos, val);
    else up(rs, m + 1, r, pos, val);
    d[o] = (d[ls] + d[rs]) % mod;
}
int qu(int o, int l, int r, int ql, int qr){
    if(l >= ql && r <= qr) return d[o];
    int m = (l + r) / 2;
    int res1 = 0, res2 = 0;
    if(ql <= m) res1 = qu(ls, l, m, ql, qr);
    if(qr > m) res2 = qu(rs, m + 1, r, ql, qr);
    return (res1 + res2) % mod;
}
void solve(){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i], b[i] = a[i];
    sort(b + 1, b + 1 + n);
    int n1 = unique(b + 1, b + 1 + n) - b - 1;
    for(int i = 1; i <= n; i++){
        a[i] = lower_bound(b + 1, b + 1 + n1, a[i]) - b;
    }
    ll ans = 0;
    for(int i = 1; i <= n; i++){
        ll res = 0;
        if(a[i] + 1 <= n1){
            res = qu(1, 1, n1, a[i] + 1, n1);
        }
        ans = (ans + res + 1) % mod;
        up(1, 1, n1, a[i], (res + 1) % mod);
    }
    cout << ans << endl;
}
int main(){
    IO;
    solve();
}

全部评论

相关推荐

头像
03-10 11:27
已编辑
门头沟学院 Java
📍面试公司:字节跳动👜面试岗位:后端开发📖面试问题:1.&nbsp;自我介绍2.&nbsp;开源经历都做了什么3.&nbsp;项目里的延时任务怎么用的4.&nbsp;定时任务呢5.&nbsp;分布式锁怎么实现6.&nbsp;如果锁过期了导致其它节点也执行定时任务怎么办(redission的看门狗,续期。或者不给锁设置过期时间,并将锁的value设置为节点ID,其它线程拿到锁的时候判断一下value是不是自己的ID,如果不是就不执行定时任务)7.&nbsp;volatile具体是怎么保证可见性和指令重排序,禁止指令重排序有什么实际的例子吗,具体是怎么起作用的(单例模式双重校验锁)8.&nbsp;synchronized又是怎么保证可见性的9.&nbsp;写代码,两个线程分别打印奇数和偶数10.&nbsp;给了一个SQL题,有id,type,&nbsp;createtime,name四个字段。建立了一个联合索引(type,&nbsp;createtime,&nbsp;name)。select&nbsp;*&nbsp;from&nbsp;table&nbsp;where&nbsp;type&nbsp;=&nbsp;1&nbsp;and&nbsp;createtime&nbsp;>&nbsp;xxx&nbsp;and&nbsp;name&nbsp;=&nbsp;%xxx%。怎么走索引。name&nbsp;=&nbsp;xxx%呢11.&nbsp;又给了一个sql题,有id&nbsp;和balance两个字段。A给B转账,怎么实现。12.&nbsp;如果与此同时,B也在给A转账呢,两个事务会发生什么情况13.&nbsp;有一个存储了几百万个电话号码的文件,怎么找到重复的电话号码(哈希表,位图,字典树)14.&nbsp;算法题,最长公共子序列&nbsp;15.&nbsp;反问🙌面试体验:事后复盘发现问题还是比较少的,但是一共面了70分钟。。。#软件开发笔面经#
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务