LCT WA on #5 求助
  • 板块CF76A Gift
  • 楼主luckydrawbox
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/7 18:37
  • 上次更新2023/11/5 20:16:14
查看原帖
LCT WA on #5 求助
419144
luckydrawbox楼主2023/8/7 18:37

RT,从魔法森林过来的。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
	long long x=0,f=1;char ch=getchar();
	while(!isdigit(ch))
	{if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=5e4+10,M=5e4+10;
int n,m,sz;
ll ans=-1;
struct asdf{
	int x,y;
	ll a,b;
}c[M];
bool cmp(asdf p,asdf q){
	return p.a<q.a;
}
multiset<ll>s;
#define pl a[p].ch[0]
#define pr a[p].ch[1]
struct LCT{
	struct Tree{
		int ch[2],fa;
		ll mx,val,id,vid,rev;
	}a[M*2];
	bool isroot(int p){
		return a[a[p].fa].ch[0]!=p&&a[a[p].fa].ch[1]!=p;
	}
	void pushup(int p){
		a[p].mx=a[p].val;a[p].id=a[p].vid;
		if(a[pl].mx>a[p].mx)
			a[p].mx=a[pl].mx,a[p].id=a[pl].id;
		if(a[pr].mx>a[p].mx)
			a[p].mx=a[pr].mx,a[p].id=a[pr].id;
	}
	void pushrev(int p){
		swap(pl,pr);a[p].rev^=1;
	}
	void pushdown(int p){
		if(a[p].rev){
			if(pl)pushrev(pl);
			if(pr)pushrev(pr);
			a[p].rev=0;
		}
	}
	void update(int p){
		if(!isroot(p))update(a[p].fa);
		pushdown(p);
	}
	int get(int p){
		return a[a[p].fa].ch[1]==p;
	}
	void rotate(int p){
		int fp=a[p].fa,ffp=a[fp].fa;
		int ty=get(p);
		if(!isroot(fp))a[ffp].ch[get(fp)]=p;
		a[p].fa=ffp;a[fp].ch[ty]=a[p].ch[ty^1];
		if(a[p].ch[ty^1])a[a[p].ch[ty^1]].fa=fp;
		a[fp].fa=p;a[p].ch[ty^1]=fp;
		pushup(fp);pushup(p);
	}
	void splay(int p){
		update(p);
		for(int fp;!isroot(p);rotate(p)){
			fp=a[p].fa;
			if(!isroot(fp))
				rotate(get(p)^get(fp)?p:fp);
		}
	}
	void access(int p){
		for(int q=0;p;p=a[q=p].fa)
			splay(p),pr=q,pushup(p);
	}
	void makeroot(int p){
		access(p);splay(p);pushrev(p);
	}
	int findroot(int p){
		access(p);splay(p);
		while(pl)pushdown(p),p=pl;
		splay(p);return p;
	}
	void split(int p,int q){
		makeroot(p);access(q);splay(q);
	}
	void link(int p,int q){
		makeroot(p);
		if(p!=findroot(q))a[p].fa=q;
	}
	void cut(int p,int q){
		makeroot(p);
		if(p==findroot(q)&&a[q].fa==p&&!a[q].ch[0]){
			a[q].fa=pr=0;
			pushup(p);
		}
	}
	void change(int p,ll val,int vid){
		splay(p);a[p].val=val;a[p].vid=vid;pushup(p);
	}
	void add(int p,asdf t){
		change(p,t.b,p-n);
		if(findroot(t.x)!=findroot(t.y)){
			link(t.x,p);link(t.y,p);
			s.insert(t.b);
			sz++;
		}
		else{
			split(t.x,t.y);
			if(a[t.y].mx>t.b){
				int u=a[t.y].id;
				int x=c[u].x,y=c[u].y;
				s.erase(a[t.y].mx);
				cut(x,u+n);cut(u+n,y);
				s.insert(t.b);
				link(t.x,p);link(t.y,p);
			}
		}
	}
}lct;
int main(){
	n=read();m=read();
	ll G=read(),S=read();
	for(int i=1;i<=m;i++){
		c[i].x=read();c[i].y=read();c[i].a=read()*G;c[i].b=read()*S;
	}
	sort(c+1,c+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(c[i].x==c[i].y)continue;
		lct.add(i+n,c[i]);
		if(sz==n-1){
			multiset<ll>::iterator it=s.end();
			ll sum=(*(--it));
			if(ans<0||sum+c[i].a<ans){
				ans=sum+c[i].a;
			}
		}
	}
	write(ans);
	return 0;
}
2023/8/7 18:37
加载中...