为什么会 MLE on subtask #1?
查看原帖
为什么会 MLE on subtask #1?
1127667
_Icetihw_楼主2024/10/7 16:41

本来A了,然后包装一下变MLE了。

#include<bits/stdc++.h>
#define ll long long
#define N 100005
using namespace std;
namespace L_Tree{
    struct Tree{
        ll dis[N],key[N],l[N],r[N],fa[N],tot;
        Tree() {for(int i=1;i<=N;i++) dis[i] = key[i] = l[i] = r[i] = 0 , fa[i] = i; tot = 0;}
        inline void build_split(ll a[],ll n) {for(int i=1;i<=n;i++) key[++tot] = a[i];}
        inline ll find(ll x) {return (x == fa[x] ? x : fa[x] = find(fa[x]));}
        inline ll update(ll A,ll B){
            if(!A || !B) return A + B;
            if(key[A] > key[B]) swap(A , B);
            r[A] = update(r[A] , B);
            if(dis[r[A]] > dis[l[A]]) swap(l[A] , r[A]);
            dis[A] = (r[A] ? dis[r[A]] + 1 : 0);
            return A;
        }
        inline ll merge(ll A,ll B){
            A = find(A) , B = find(B);
            if(A != B) return fa[A] = fa[B] = update(A , B);
        }
        inline ll front(ll x) {x = find(x) ; return key[x];}
        inline void pop(ll x) {x = find(x) ; fa[x] = fa[l[x]] = fa[r[x]] = update(l[x] , r[x]);}
        inline void add(ll x,ll A) {key[++tot] = x ; A = find(A) ; merge(A , tot);}
        inline void build_merge(ll a[],ll n) {
            key[++tot] = a[1];
            for(int i=2;i<=n;i++) add(a[i] , 1);
        }
    } ;
}
using namespace L_Tree;
ll n,m;
ll a[N];
bitset<N> vis;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    Tree tr;
    tr.build_split(a,n);
    ll opt,x,y;
    while(m--){
        cin>>opt;
        if(opt == 1){
            cin>>x>>y;
            if(vis[x] || vis[y]) continue;
            tr.merge(x,y);
        }
        else{
            cin>>x;
            if(vis[x]) {cout<<-1<<endl;continue;}
            vis[tr.find(x)] = 1;
            cout<<tr.front(x)<<endl;
            tr.pop(x);
        }
    }
    return 0;
}

什么原理? thxthx

2024/10/7 16:41
加载中...