【CF878C】Tournament

题意:有k个项目,n个运动员,第i个运动员的第j个项目的能力值为aij。一场比赛可以通过如下方式进行:

每次选出2个人和一个项目,该项目能力值高者获胜,败者被淘汰,胜者继续比赛。最后一个人是冠军。

在一场比赛中,你可以任意安排比赛顺序,任意选择每次的参赛者和项目,现在想知道的是有多少人可能成为最后的冠军。

为了加大难度,一共有n次询问,第i次询问是前i个人进行比赛,问最终由多少人可能成为总冠军。

n<=50000,k<=10,aij<=10^9

题解:只要敢想就去写吧。

我们将所有人看成一张n个点的有向图,如果i的某项能力值比j高,则从i到j连一条有向边。我们将得到的整个图中的强连通分量缩成点,那么最终得到的一定是一条链。其中每个强联通分量中每一项的最小值都比下一个强联通分量的最大值还大。然后我们依次加入每个点,考虑如何维护这条链。

在加入第i个人时,对于每个项目,我们可以在set中找到这个人的前驱和后继,并记录二者在链中的位置。令a为每个项目中前驱位置的最大值,b为每个项目中后继位置的最小值,如果a>b,则说明i能打过a,b能打过i,并且a能打过b,出现了一个环!我们将这个环暴力缩掉即可;如果a=b,我们将i加入到a的强联通分量即可;如果a<b,那么a=b-1,我们把i加到ab中间即可。

可以用并查集维护连通性,链表维护整条链。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <set>
#include <utility>
#define mp(A,B) make_pair(A,B)
using namespace std;
const int maxn=50010;
int n,m,last;
int f[maxn],mx[maxn][11],mn[maxn][11],siz[maxn],nxt[maxn],v[11]; set<pair<int,int> > s[11];
set<pair<int,int> >::iterator it; inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
inline void merge(int a,int b)
{
for(int i=1;i<=m;i++) mx[b][i]=max(mx[b][i],mx[a][i]),mn[b][i]=min(mn[b][i],mn[a][i]);
siz[b]+=siz[a],f[a]=b;
}
int main()
{
n=rd(),m=rd();
int i,j,a,b,t;
for(j=1;j<=m;j++) s[j].insert(mp(mx[1][j]=mn[1][j]=rd(),1));
f[1]=siz[1]=last=1;
puts("1");
for(i=2;i<=n;i++)
{
a=b=0;
for(j=1;j<=m;j++)
{
v[j]=rd();
it=s[j].upper_bound(mp(v[j],i));
if(it!=s[j].end())
{
t=find((*it).second);
if(!b||mx[t][j]<mx[b][j]) b=t;
}
if(it!=s[j].begin())
{
it--,t=find((*it).second);
if(!a||mx[t][j]>mx[a][j]) a=t;
}
s[j].insert(mp(v[j],i));
}
f[i]=i,siz[i]=1;
for(j=1;j<=m;j++) mx[i][j]=mn[i][j]=v[j];
if(!a) nxt[i]=b;
else if(!b) last=i,nxt[a]=i;
else if(a==b) merge(i,a);
else if(mx[a][1]<mx[b][1]) nxt[a]=i,nxt[i]=b;
else
{
for(t=b;t!=a;t=nxt[t],merge(t,b));
merge(i,b);
nxt[b]=nxt[a];
if(a==last) last=b;
}
printf("%d\n",siz[last]);
}
return 0;
}

【CF878C】Tournament set+并查集+链表的更多相关文章

  1. Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)

    Problem   Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...

  2. CodeForces 566D Restructuring Company (并查集+链表)

    题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中. 析:很容易知道是用并 ...

  3. CodeForces - 357C Knight Tournament 伪并查集(区间合并)

    Knight Tournament Hooray! Berl II, the king of Berland is making a knight tournament. The king has a ...

  4. 100: cf 878C set+并查集+链表

    $des$Berland要举行 $n$ 次锦标赛,第一次只有一个人,之后每一次会新加入一个人.锦标赛中有 $k$ 种运动项目,每个人在这 $k$ 种项目上都有一个能力值,每次会选择任意两个还未被淘汰的 ...

  5. 稀疏图(邻接链表),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)

    全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...

  6. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem C (Codeforces 828C) - 链表 - 并查集

    Ivan had string s consisting of small English letters. However, his friend Julia decided to make fun ...

  7. cf-Round541-Div2-F(并查集+静态链表)

    题目链接:http://codeforces.com/contest/1131/problem/F 思路: 很容易看出这是一道并查集的题目,因为要输出每个cage中住的鸟的编号,故采用静态链表.用l[ ...

  8. Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))

    F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

随机推荐

  1. jsTree 插件Ajax数据

    完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  2. Objective-C语法之NSPredicate的使用

    正则表达式判断手机号码和电话号码的方法: #import <Foundation/Foundation.h> /** 正则判断手机号码地址格式 */ BOOL isMobileNumber ...

  3. jiffies存放

    固然书本上讲明jiffies是jiffies_64的低32位,但是我还是自己测试了下,重点在于链接脚本的写法. 此处只是为了测试,因此简化链接脚本. /* link.lds */ 1 ENTRY(_s ...

  4. sql server 2005 怎么看是不是企业版

    已经安装了SQL server 2005 怎么确定它是企业版 还是标准版??? 执行sql:SELECT @@VERSION在结果里看,比如我这里是(里面有Enterprise Edition,表示企 ...

  5. [转]油猴Tampermonkey-让百度云下载飞起来

    1. 简介 Tampermonkey,油猴脚本是一款免费的浏览器扩展程序. 我们这里用于Chrome浏览器,目的是为了让百度云里面的文件以满速下载,VIP还得出钱呢. 2. 安装 安装Lantern蓝 ...

  6. jrMz and angles(水题)

    jrMz and angles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  7. 第十七篇:IO复用之select实现

    前言 在看过前文:初探IO复用后,想必你已对IO复用这个概念有了初步但清晰的认识. 接下来,我要在一个具体的并发客户端中实现它(基于select函数),使得一旦服务器中的客户进程被终止的时候,客户端这 ...

  8. apache下配置php环境

    1. apache下载 http://httpd.apache.org/download.cgi 2. php下载 http://windows.php.net/download/ 3. 配置 apa ...

  9. 关于GDI+的一些使用基础设置

    一.新建一个MFC的单文档工程,例如工程名字叫GDIPLUSTEST1. 二.在工程的stdafx.h头文件中添加入 #include "gdiplus.h" using name ...

  10. 【LeetCode OJ】Merge Two Sorted Lists

    题目:Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...