您的位置:首页 > 其它

Codeforces Round #207 (Div. 2) C. Knight Tournament (并查集缩点)

2013-10-23 08:12 429 查看
题目点此

STL处理的代码

题意:

第一行输入n,m,n表示有n个人(标号1~n),m表示有m 场战斗,接下来m行,每行输入l , r , x ,表示标号从l 到 r的人进行了一场战斗,其中x (l<=x<=r) 为最后的胜利者,即x杀死了该场战斗中的其它人,那么在下一场 战斗中死了的人不再进入战斗;要求输出杀死每一个人的直接凶手的标号,最后活着的那个人的输出标号为0;

Sample test(s)

input
4 3
1 2 1
1 3 3
1 4 4


output
3 1 4 0


input
8 4
3 5 4
3 7 6
2 8 8
1 8 1


output
0 8 4 6 4 8 6 1


#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long LL;
const int V=300100;
int r[V],ret[V];
int find(int x)
{
//所有缩进了的点的父结点改为第一个比其大并且未被缩进的点 
if(x!=r[x])r[x]=find(r[x]);
return r[x];
}
int n,m,L,R,x;
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n+1;i++)r[i]=i;
memset(ret,0,sizeof(ret));
while(m--)
{
scanf("%d%d%d",&L,&R,&x);
int u;
u=find(L);
while(1)
{
if(u>=x)break;
ret[u]=x;
r[u]=u+1;   //父结点为第一个比其大并且未被缩进的点
u=find(u);
}
u=find(x+1);
while(1)
{
if(u>R)break;
ret[u]=x;
r[u]=u+1;
u=find(u);
}
}
for(int i=1;i<=n;i++)
printf("%d ",ret[i]);puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: