QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#404559#2543. Edges, Colors and MSTZxc200611WA 3ms13948kbC++142.3kb2024-05-04 08:25:532024-05-04 08:25:55

Judging History

你现在查看的是最新测评结果

  • [2024-05-04 08:25:55]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:13948kb
  • [2024-05-04 08:25:53]
  • 提交

answer

/*
对于一条非树边,它的权值要比跨过的树边都要大。
要求的是字典序最小的权值排列。

设当前填到权值 v。
若当前未填的,编号最小的边为树边,则直接填上 v+1。
否则其为非树边。把中间的树边按编号从小到大填上 v+1...v+l,然后把 v+l+1 填在这条边上。
又是树剖?树上并查集就好?
*/
#include<bits/stdc++.h>
using namespace std;
const int mxlg=20;
struct DisjointSetUnion
{
	int fth[210000];
	void init(int n)
	{
		iota(fth,fth+n+1,0);
	}
	int find(int u)
	{
		return fth[u]==u?u:(fth[u]=find(fth[u]));
	}
	void merge(int u,int v)
	{
		fth[find(u)]=find(v);
	}
};
struct Edge
{
	int u,v,ty,id;
};
int n,m;
Edge edg[210000];
vector<Edge> t[210000];
int feid[210000],dep[210000],fth[210000][22];
DisjointSetUnion dsu;
int ans[210000];
void dfs(int u,int f)
{
	cout<<"dfs u="<<u<<" f="<<f<<endl;
	fth[u][0]=f,dep[u]=dep[f]+1;
	for(int i=1;i<=mxlg;i++)
		fth[u][i]=fth[fth[u][i-1]][i-1];
	for(int i=0;i<t[u].size();i++)
	{
		int v=t[u][i].v;
		if(v==f)
			continue;
		feid[v]=t[u][i].id;
		dfs(v,u);
	}
}
int lca(int u,int v)
{
	cout<<"lca "<<u<<" "<<v<<" = ";
	if(dep[u]<dep[v])
		swap(u,v);
	for(int i=mxlg;i>=0;i--)
	{
		if(dep[fth[u][i]]>=dep[v])
			u=fth[u][i];
	}
	for(int i=mxlg;i>=0;i--)
	{
		if(fth[u][i]!=fth[v][i])
			u=fth[u][i],v=fth[v][i];
	}
	cout<<(u==v?u:fth[u][0])<<endl;
	return u==v?u:fth[u][0];
}
void getEdges(int u,int f,vector<int> &res)
{
	u=dsu.find(u);
	while(dep[u]>dep[f])
	{
		res.push_back(feid[u]);
		dsu.merge(u,fth[u][0]);
		u=dsu.find(u);
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v,ty;
		cin>>u>>v>>ty;
		edg[i]=((Edge){u,v,ty,i});
		if(ty==1)
		{
			t[u].push_back((Edge){u,v,ty,i});
			t[v].push_back((Edge){v,u,ty,i});
		}
	}
	dfs(1,0);
	dsu.init(n);
	for(int i=1,c=0;i<=m;i++)
	{
		// cout<<"Edge #"<<i<<" ("<<edg[i].u<<","<<edg[i].v<<") ty="<<edg[i].ty<<endl;
		vector<int> eid(0);
		int l=lca(edg[i].u,edg[i].v);
		getEdges(edg[i].u,l,eid),getEdges(edg[i].v,l,eid);
		sort(eid.begin(),eid.end());
		for(int x:eid)
			ans[x]=++c;
		if(edg[i].ty==0)
			ans[edg[i].id]=++c;
	}
	for(int i=1;i<=m;i++)
		cout<<ans[i]<<" ";
	cout<<endl;
}

详细

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 13948kb

input:

4 5
1 2 0
2 3 1
3 4 1
2 4 0
1 3 1

output:

dfs u=1 f=0
dfs u=3 f=1
dfs u=2 f=3
dfs u=4 f=3
lca 1 2 = 1
lca 2 3 = 3
lca 3 4 = 3
lca 2 4 = 3
lca 1 3 = 1
3 1 4 5 2 

result:

wrong output format Expected integer, but "dfs" found