并查集好像没有起作用?
查看原帖
并查集好像没有起作用?
747882
_adil_楼主2023/8/5 16:01

40pt tle求助

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<math.h>
#include<set>
#include<vector>
#include<map>
#include<utility>
#include<iomanip>
#include<iterator>
#define N 500009
#define INF 0x3f3f3f3f
#define mod 998244353
#define int long long
#define lowbit(x) x&(-x)
using namespace std;
typedef long double ldb;
typedef pair<int,int> pii;
int n,m;
int a[N],fa[N],bit[N];
int find(int x){
  return fa[x]==x+1?x:fa[x]=find(fa[x]);
}
void unite(int x,int y){
  int fx=find(x),fy=find(y);
  if(fx!=fy)fa[fx]=fy;
}
void add(int x,int y){
  for(;x<=n;x+=lowbit(x))bit[x]+=y;
}
int ask(int x){
  int ans=0;
  for(;x;x-=lowbit(x))ans+=bit[x];
  return ans;
}
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>a[i];fa[i]=i+1;add(i,a[i]);
  }
  cin>>m;fa[n+1]=n+2;
  for(int j=1;j<=m;j++){
    int op,l,r;
    cin>>op>>l>>r;if(l>r)swap(l,r);
    if(op==1)cout<<ask(r)-ask(l-1)<<endl;
    else{
      for(int i=l;i<=r;i=fa[i]){
        int md=sqrt(a[i]);
        add(i,md-a[i]);
        a[i]=sqrt(a[i]);
        if(a[i]==1)unite(i,i+1);
      }
    }
  }
  return 0;
}
2023/8/5 16:01
加载中...