Cod sursa(job #541626)

Utilizator galacticaBattlestar galactica Data 25 februarie 2011 12:36:35
Problema Lazy Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 2.4 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct muchie{
	int a,b;
	long long v,p;
}muc[200100];
int prf[2][100],A[100],B[100];
inline long long modul(int x){
	if(x<0)
		return -x;
	return x;
}
void profit(int poz,int x){
	int i,j,t,ax;
	for(i=prf[x][0];i>=0;--i)
		prf[x][i]=0;
	for(i=0;i<50;++i)
		A[i]=B[i]=0;
	for(ax=modul(muc[poz].p);ax;ax/=10)
		A[++A[0]]=ax%10;
	for(ax=modul(muc[poz].v);ax;ax/=10)
		B[++B[0]]=ax%10;
	for(i=1;i<=A[0];++i){
		for(t=0,j=1;j<=B[0] || t;++j, t/=10)
			prf[x][i+j-1]=(t=prf[x][i+j-1]+A[i]*B[j])%10;
		if(i+j-2>prf[x][0])
			prf[x][0]=i+j-2;
	}
	for(i=1,t=0;i<=prf[x][0];++i)
		prf[x][i]+=(t=(prf[x][i]-=((i<=A[0])?A[i]:0)+t)<0)*10;
	for(;prf[x][0]>1 && !prf[x][prf[x][0]];--prf[x][0])
		;
	if(muc[poz].p<0)
		prf[x][45]=1;
	if(muc[poz].p>0)
		prf[x][45]=-1;
	if(prf[x][0]==1 && !prf[x][1])
		prf[x][45]=0;
}
int comp(){
	if(prf[0][45]<prf[1][45])
		return -1;
	if(prf[0][45]>prf[1][45])
		return 1;
	if(prf[0][45]==1){
		if(prf[0][0]>prf[1][0])
			return 1;
		if(prf[0][0]<prf[1][0])
			return -1;
	}
	if(prf[0][45]==-1){
		if(prf[0][0]>prf[1][0])
			return -1;
		if(prf[0][0]<prf[1][0])
			return 1;
	}
	if(prf[0][45]==1){
		for(int i=prf[0][0];i;--i){
			if(prf[0][i]>prf[1][i])
				return 1;
			if(prf[0][i]<prf[1][i])
				return -1;
		}
	}
	if(prf[0][45]==-1){
		for(int i=prf[0][0];i;--i){
			if(prf[0][i]>prf[1][i])
				return -1;
			if(prf[0][i]<prf[1][i])
				return 1;
		}
	}
	return 0;
}
struct cmp{
	bool operator() (const int a,const int b){
		if(muc[a].v<muc[b].v)
			return true;
		if(muc[a].v>muc[b].v)
			return false;
		profit(a,0);
		profit(b,1);
		if(comp()<0)
			return false;
		return true;
	}
};
int N,M,par[200100],sol[200100],ind[200100];
int tata(int x){
	if(par[x]==x)
		return x;
	return par[x]=tata(par[x]);
}
void solve(){
	int i,x,y;
	for(i=1;sol[0]<N-1;++i){
		x=tata(muc[ind[i]].a);
		y=tata(muc[ind[i]].b);
		if(x==y)
			continue;
		par[x]=y;
		sol[++sol[0]]=ind[i];
	}
}
int main(){
	freopen("lazy.in","r",stdin);
	freopen("lazy.out","w",stdout);
	int i;
	scanf("%d%d",&N,&M);
	for(i=1;i<=M;++i){
		scanf("%d%d%lld%lld",&muc[i].a,&muc[i].b,&muc[i].v,&muc[i].p);
		ind[i]=i;
	}
	for(i=1;i<=N;++i)
		par[i]=i;
	sort(ind+1,ind+N+1,cmp());
	solve();
	for(i=1;i<=sol[0];++i)
		printf("%d\n",sol[i]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}