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
output
input
output
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; }
相关文章推荐
- MongoDB资料汇总专题
- Regular Expression Matching
- SAX解析XML文件
- 几种常见的排序方法
- PageRank程序的输入部分
- 是男人就做的50道题目 题解
- 简单的DOM解析XML文件,并实现增,删,改,查的操作
- 同事和朋友
- Java vs C++ (6) 构造器中调用虚函数
- sqlite3使用简单介绍
- java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式详解
- c++ 如果函数无参数,那么应声明其参数为 void
- mongodb的地理位置索引
- 使用SQLServer 2008的CDC功能实现数据变更捕获
- SpringAOP之学习总结
- xcode5-ios7-如何添加120x120图标(ios7图标命名)
- 使用ViewPager需要注意的地方
- Perl file checking --- How to get information about a file
- Struts2中使用FreeMarker充当表现层
- 使用mybatis操作mysql数据库SUM方法返回NULL解决