蒟蒻求助复杂度
查看原帖
蒟蒻求助复杂度
455490
Sharpsmile楼主2024/1/10 19:11

这个复杂度我自己觉得是 O(nlog⁡2n)O(n\log ^2 n) 的,但是咋都只能五十分。

有没有大佬帮忙看下是复杂度假了还是单纯常数大啊qwq

评测链接:https://www.luogu.com.cn/record/142444187

#include <bits/stdc++.h>
//#define int long long
#define double long double 
#define endl "\n"
#define pii pair<double,int>
#define p1(x) ((x).first)
#define p2(x) ((x).second)
#define lc(x) ((x)<<1)
#define rc(x) ((x)<<1|1)
#define len(x) T[x].len
#define sum(x) T[x].sum
#define pre(x) T[x].pre
#define suf(x) T[x].suf
#define mx(x) T[x].mx
#define i128 __int128_t
using namespace std;
struct edge{
	int u,v,w;
};
vector<edge>E[50030<<2],G[50030<<2];
int f[20030],siz[20030];
stack<int>LST;
inline int ff(int x){
	return f[x]==x?x:ff(f[x]);
} 
inline bool merge(int x,int y){
	x=ff(x),y=ff(y);
	if(x==y)return 0;
	if(siz[x]<siz[y])swap(x,y);
	f[y]=x;
	siz[x]+=siz[y];
	LST.push(y);
	return 1;
}
inline void rvk(){
	int x=LST.top();
	LST.pop();
	siz[f[x]]-=siz[x];
	f[x]=x;	
}
inline bool cmp(edge A,edge B){
	return A.w<B.w;
}
inline vector<edge> KR(vector<edge>E){
	vector<edge>RES;
	int cnt=0;
	sort(E.begin(),E.end(),cmp);
	
	for(auto e:E){
		if(merge(e.u,e.v))
		cnt++,RES.push_back(e);
	}
	while(cnt--)rvk();
	return RES;
}
const int INF=1e11;
inline void calc(int x,int l,int r,vector<edge>P,long long s){
	for(edge e:E[x])
	P.push_back(e);
	if(l==r){
		auto T=KR(P);
		for(auto e:T)
			s+=e.w;
		cout<<s<<endl;
		return ;
	}
	vector<edge>SP=P;
	for(edge e:G[x])
		SP.push_back({e.u,e.v,-INF});
	vector<edge>R=KR(SP);
	int cnt=0;
	SP.clear();
	int cw=0;
	for(edge e:R)
		if(e.w!=-INF)
		cnt+=merge(e.u,e.v),s+=e.w;
	for(edge e:P)
		if(ff(e.u)!=ff(e.v))
			SP.push_back(e);
	for(edge e:G[x])
		SP.push_back({e.u,e.v,INF});
	R=KR(SP);
	vector<edge>N;
	for(edge e:R)
		if(e.w!=INF)N.push_back(e);
	int mid=l+r>>1;
	calc(lc(x),l,mid,N,s);
	calc(rc(x),mid+1,r,N,s);
	while(cnt--)rvk();
}
int lst[50300];
edge ae[50300];
inline void mod(int x,int l,int r,int L,int R,edge e){
	if(L>R)return ;
//	if(x==1){
//		cout<<L<<"x"<<R<<" "<<e.u<<" "<<e.v<<" "<<e.w<<endl; 
//	}	
	if(L<=l&&r<=R){
		E[x].push_back(e);
		return ;
	}
	G[x].push_back(e);
	int mid=l+r>>1;
	if(L<=mid)mod(lc(x),l,mid,L,R,e);
	if(R>mid)mod(rc(x),mid+1,r,L,R,e);
	
}
int n,m,q;
signed main(){
    ios::sync_with_stdio(0);
//    freopen("P2483_3.in","r",stdin);
//    freopen("b.out","w",stdout);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
	f[i]=i;
	for(int i=1;i<=m;i++)
		cin>>ae[i].u>>ae[i].v>>ae[i].w; 
	for(int i=1;i<=q;i++){
		int k,d;
		cin>>k>>d;
		mod(1,1,q,lst[k]+1,i-1,ae[k]);
		ae[k].w=d;
		lst[k]=i-1;
	} 
	for(int i=1;i<=m;i++)
	mod(1,1,q,lst[i]+1,q,ae[i]);
	calc(1,1,q,{},0);
	
	cout.flush();
    return 0;
}
/*
*/





2024/1/10 19:11
加载中...