萌新刚学 OI 求助猴子王 MLE
查看原帖
萌新刚学 OI 求助猴子王 MLE
281497
KEBrantily楼主2021/6/24 21:28

10 pts。

其中第一个点就 MLE。

思路是将权值的相反数加入左偏树中。

对于每次询问的 x,yx,y,找出其根节点 a,ba,b,并新建权值分别为 a,ba,b 的一半的点与它们合并,再删去 a,ba,b 这两个点,最后合并这两颗树。

下载了第一个数据点,答案是对的,跑的也挺正常。

按理说,加上新建的点应该会有 300000 个,但是不管开大开小第一个点都是 MLE。

求助原因。

#include<queue>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 10010//目前这个不用管它,[10000 - 2000000]都是 MLE
#define INF 0x3f3f3f3f
//#define int long long

using namespace std;

int n,m,cnt;

int read(){
  int s=0,w=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
  return s*w;
}

namespace LIT{
  #define ls lson[x]
  #define rs rson[x]
  bool vis[maxn];
  int fa[maxn],dis[maxn];
  int lson[maxn],rson[maxn];
  
  struct node{
    int pos,val;
    bool operator < (const node &b) const{
      return val^b.val?val<b.val:pos<b.pos;  
    } 
  }v[maxn];
  
  int findf(int x){
    return fa[x]==x?x:fa[x]=findf(fa[x]);
  }
  
  int merge(int x,int y){
    if(!x||!y) return x+y;
    if(v[y]<v[x]) swap(x,y);
    rs=merge(rs,y);
    if(dis[ls]<dis[rs])swap(ls,rs);
    dis[x]=dis[rs]+1;
    return x;
  }
}

using namespace LIT;

signed main(){
  n=read();dis[0]=-1;
  for(int i=1;i<=n;i++){
    v[i].val=read()*-1;
    v[i].pos=fa[i]=i;
  }
  m=read();cnt=n;
  for(int i=1,x,y;i<=m;i++){
    x=findf(read());y=findf(read());
    if(x==y){printf("-1\n");continue;}
    
    v[++cnt].pos=fa[cnt]=cnt;v[cnt].val=-(-v[x].val>>1);//新建第一个
    fa[cnt]=fa[x]=merge(cnt,x);//合并第一个
    fa[lson[x]]=fa[rson[x]]=fa[x]=merge(lson[x],rson[x]);//删去原根节点
    lson[x]=rson[x]=dis[x]=0;
    
    v[++cnt].pos=fa[cnt]=cnt;v[cnt].val=-(-v[y].val>>1);//第二个同上
    fa[cnt]=fa[y]=merge(cnt,y);
    fa[lson[y]]=fa[rson[y]]=fa[y]=merge(lson[y],rson[y]);
    lson[y]=rson[y]=dis[y]=0;
    
    int fir=findf(cnt-1),sec=findf(cnt);
    fa[fir]=fa[sec]=merge(fir,sec);//合并两棵树
    printf("%d\n",-v[findf(fir)].val);
  }
  return 0;
}

附第一个点数据:

16
8034
1215
24625
30817
5188
18504
10811
32596
13932
15464
4297
19261
10610
6349
8766
5223
37
14 1
13 8
12 15
6 7
4 2
7 7
1 12
3 1
8 1
4 5
12 5
3 10
16 5
10 10
4 6
6 14
3 4
14 8
2 1
1 8
8 16
8 2
13 3
14 11
8 1
13 12
12 12
16 14
6 8
7 4
9 10
1 16
13 2
10 2
5 5
6 7
5 4
4017
16298
9630
9252
15408
-1
4815
12312
8149
7704
6156
7732
5305
-1
5405
-1
-1
-1
-1
-1
-1
-1
-1
4626
-1
-1
-1
-1
-1
-1
6966
-1
-1
-1
-1
-1
-1
2021/6/24 21:28
加载中...