比赛 20120704 评测结果 AWWWWWWWWT
题目名称 危险游戏 最终得分 10
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-04 10:24:26
显示代码纯文本
#include <cstdio>

#define I_F "tubea.in"
#define O_F "tubea.out"

const int MAXn=10000;
const int MAXm=100000;

struct edge
{
	int x, y, z;
	unsigned long s;
	bool f;
};

int n, m;
edge s[MAXm];
unsigned long tot;
int h1[MAXm+1], h2[MAXm+1];

void Input();
void Makeheap();
void Heapcpy();
template<typename Any>
inline void Swap(Any&, Any&);
void Heapdelete(int*, int&, const int&);
void Heapfixup(int*, const int&);
int Root(int*, const int&);
inline void Union(int*, const int&, const int&);
void Kruskal();
inline void Output();

int main()
{
	int q, a;
	unsigned long w;
	Input();
	Makeheap();
	Heapcpy();
	Kruskal();
	Output();
	for (scanf("%d",&q); q>0; --q)
	{
		scanf("%d%ld",&a,&w);
		if (s[--a].f)
		{
			tot-=(s[a].s-w);
			s[a].s=w;
			if (s[a].s<s[h1[s[a].z/2]].s)
				Heapfixup(h1,s[a].z);
		}
		else
		{
			s[a].s=w;
			if (s[a].s<s[h1[s[a].z/2]].s)
				Heapfixup(h1,s[a].z);
			Heapcpy();
			Kruskal();
		}
		Output();
	}
	return 0;
}

void Input()
{
	freopen(I_F,"r",stdin);
	scanf("%d%d",&n,&m);
	for (int i=0; i<m; ++i)
	{
		scanf("%d%d%ld",&s[i].x,&s[i].y,&s[i].s);
		s[i].f=false;
		--s[i].x;
		--s[i].y;
	}
	freopen(O_F,"w",stdout);
}

void Makeheap()
{
	h1[1]=0;
	s[0].z=1;
	for (int i=1; i<m; ++i)
	{
		h1[i+1]=i;
		s[i].z=i+1;
		if (s[i].s<s[h1[(i+1)/2]].s)
			Heapfixup(h1,i+1);
	}
}

void Heapcpy()
{
	for (int i=1; i<=m; ++i)
		h2[i]=h1[i];
}

template<typename Any>
inline void Swap(Any &a, Any &b)
{
	Any t=a;
	a=b;
	b=t;
}

void Heapdelete(int *h, int &l, const int &x)
{
	h[x]=h[l--];
	int i=x;
	for (bool f=true; f; )
		if (i*2>l)
			f=false;
		else
			if (i*2==l)
				if (s[h[i]].s>s[h[i*2]].s)
				{
					Swap(h[i],h[i*2]);
					i=i*2;
				}
				else
					f=false;
			else
				if (s[h[i*2]].s<s[h[i*2+1]].s)
					if (s[h[i]].s>s[h[i*2]].s)
					{
						Swap(h[i],h[i*2]);
						i=i*2;
					}
					else
						f=false;
				else
					if (s[h[i]].s>s[h[i*2+1]].s)
						{
							Swap(h[i],h[i*2+1]);
							i=i*2+1;
						}
						else
							f=false;
}

void Heapfixup(int *h, const int &x)
{
	for (int i=x; i>1 && s[h[i]].s<s[h[i/2]].s; i/=2)
	{
		s[h[i]].z=i/2;
		s[h[i/2]].z=i;
		Swap(h[i],h[i/2]);
	}
}

int Root(int *c, const int &x)
{
	if (c[x]!=x)
		c[x]=Root(c,c[x]);
	return c[x];
}

inline void Union(int *c, const int &x, const int &y)
{
	c[y]=Root(c,x);
}

void Kruskal()
{
	tot=0;
	int c[MAXn];
	int l=m;
	for (int i=0; i<n; ++i)
		c[i]=i;
	for (int i=0; i<n-1; ++i)
	{
		while (Root(c,s[h2[1]].x)==Root(c,s[h2[1]].y))
			Heapdelete(h2,l,1);
		tot+=s[h2[1]].s;
		Union(c,s[h2[1]].x,s[h2[1]].y);
		Heapdelete(h2,l,1);
	}
}

inline void Output()
{
	printf("%ld\n",tot);
}