求助,为什么这颗树跑得超级慢,总和3s多
查看原帖
求助,为什么这颗树跑得超级慢,总和3s多
435689
sillage丶楼主2021/9/27 10:15
#include <cstdio>
#include <cstring>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <numeric>
#include <algorithm>
#include <functional>
#include <map>
#include <queue>
#include <vector>
#include <utility>

#define ed end()
#define bg begin()
#define mp make_pair
#define pb push_back
#define all(x) x.bg,x.ed
#define newline puts("")
#define si(x) ((int)x.size())
#define rep(i,n) for(int i = 1; i <= n; ++i)
#define rrep(i,n) for(int i = 0; i < n; ++i)
#define srep(i,s,t) for(int i = s; i <= t; ++i)
#define drep(i,s,t) for(int i = t; i >= s; --i)

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int MAX = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const ll INF_ll = 1ll*INF*INF;
const int MOD = 1e9 + 7;
const double eps = 1e-7;

struct node{
    int l, r, val;
} tr[MAX << 5];

int n, m;
int top;
int num[MAX];
int root[MAX];

inline int clone(int p){
    top++;
    tr[top] = tr[p];
    return top;
}

int build(int p, int s, int e){
    p = ++top;
    if(s == e){
        tr[p].val = num[s];
        return top;
    }
    int mid = s + ((e - s) >> 1);
    tr[p].l = build(tr[p].l, s, mid);
    tr[p].r = build(tr[p].r, mid + 1, e);
    return p;
}

int modify(int p, int s, int e, int pos, int nval){
    p = clone(p);
    if(s == e){
        tr[p].val = nval;
        return p;
    }
    int mid = s + ((e - s) >> 1);
    if(pos <= mid)tr[p].l = modify(tr[p].l, s, mid, pos, nval);
    else tr[p].r = modify(tr[p].r, mid + 1, e, pos, nval);
    return p;
}

int query(int p, int s, int e, int pos){
    if(s == e){
        return tr[p].val;
    }
    int mid = s + ((e - s) >> 1);
    if(pos <= mid) return query(tr[p].l, s, mid, pos);
    else return query(tr[p].r, mid + 1, e, pos);
}



int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m;
    rep(i, n){
        cin>>num[i];
    }
    root[0] = build(0, 1, n);
    rep(i, m){
        int ver, op, pos, value;
        cin>>ver>>op>>pos;
        if(op == 1){
            cin>>value;
            root[i] = modify(root[ver], 1, n, pos, value);
        }
        else{
            cout<<query(root[ver], 1, n, pos)<<endl;
            root[i] = root[ver];
        }
    }
    return 0;
}

rt,看见提交记录里的聚聚都是1s到2s甚至有500ms多的,为什么我的就跑的这么慢呀。

2021/9/27 10:15
加载中...