题目链接

戳我

\(Describe\)

一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边\((u, v)\)或\((v, u)\),表示\(u\)打败\(v\)或\(v\)打败\(u\)。一个选手的得分等于被他打败的选手总数。一个选手被称为\(“strong\ king”\)当且仅当他打败了所有比他分高的选手。分数最高的选手也是\(“strong\ king”\)。现在给出某场联赛所有选手的得分序列,由低到高,问合理安排每场比赛的结果后最多能有几个\(“strong\ king”\)已知选手总数不超过10个。

\(Solution\)

我们观察发现选手人数不超过\(10\)个,则说明\(“strong\ king”\)不超过10个,所以我们可以枚举\(“strong\ king”\)的个数,其实二分也可以的,将这些人的个数设为k

那么这些\(“strong\ king”\)的分数该如何确定呢?

引用一个结论:

对于一个分数序列,如果最多有\(k\)个\(“strong\ king”\),那么必然存在一种比赛情况,就是分数最大的\(k\)个人是\(“strong\ king”\)

证明:

假设序列是这个模样,\(1....i.....j.....k......n\)

假设只有\(i,k\)是\(“strong\ king”\),而j不是. 假设\(j\)输给了\(j+1\)至\(n\)区间中的\(x\)个人,那么显然\(i\)是赢了这\(x\)个人的,我们现在想把\(j\)变为\(“strong\ king”\). 那么就让把\(j\)输了的这些场全变成赢,此时\(j\)分值增加了\(x\),就将\(j\)与\(i\)之前的人们的比赛多输\(x\)场,这样\(j\)的分数守恒了,但是\(j\)一赢之后,原本输给的\(x\)个人的分数少了,那就让他们都去赢\(i\),这样他们的分数也就守恒了,此时发现\(i\)分数又不守恒了,少了\(x\),恰好刚才\(j\)去输给i之前的人了\(x\)场,\(i\)正好去赢\(x\)场,这样大家的分数都守恒了。

                                                                                                                               \(from\ here:\) 戳这

所以我们可以将前\(k\)大的分数定为\(“strong\ king”\),

接下来就是建图了:

我们首先定义一下变量:

int id[101][101];//两两比赛的编号
int b[200001];//分数

我们将\((i,j)\)之间的比赛定义为\(x\),每个队伍设为\(y[i]\)。

  • 将\(s->x\)连一条流量为\(1\)的边,\(y->t\)连一条流量为\(b[y]\)的边
  • 对于每一场比赛我们都有三种情况
    1. \(b[i]<b[j]\)并且\(i\)为\(“strong\ king”\),比赛的结果已经固定了,就是\(i\)胜利,将\(x->y[i]\)连一条流量为\(1\)的边
    2. \(b[j]<b[i]\)并且\(j\)为\(“strong\ king”\),比赛的结果也已经固定了,就是\(j\)胜利,将\(x->y[j]\)连一条流量为\(1\)的边
    3. 其他情况,比赛的结果不固定,所以要向\(y[i]\)和\(y[j]\)分别连一条流量为\(1\)的边

最后统计一下最大流就好了,判断一下最大流是不是等于\(n*(n-1)/2\),如果等于那么\(“strong\ king”\)的个数就合法

\(code\)

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#define inf 1e9
using namespace std;
typedef long long ll;
int head[100001],cnt,n,m,s,t=1000,x,y,z,dep[100001],id[101][101],b[200001];
struct node{
int to,next,v;
}a[200001];
void add(int x,int y,int c){
a[++cnt].to=y,a[cnt].next=head[x],a[cnt].v=c,head[x]=cnt;
a[++cnt].to=x,a[cnt].next=head[y],a[cnt].v=0,head[y]=cnt;
}
queue<int> q;
int bfs(){
memset(dep,0,sizeof(dep));
q.push(s);
dep[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=head[now];i;i=a[i].next){
int v=a[i].to;
if(!dep[v]&&a[i].v>0)
dep[v]=dep[now]+1,q.push(v);
}
}
if(dep[t])
return 1;
return 0;
}
int dfs(int k,int list){
if(k==t||!list)
return list;
for(int i=head[k];i;i=a[i].next){
int v=a[i].to;
if(dep[v]==dep[k]+1&&a[i].v>0){
int p=dfs(v,min(list,a[i].v));
if(p){
a[i].v-=p;
if(i&1)
a[i+1].v+=p;
else a[i-1].v+=p;
return p;
}
}
}
dep[k]=0;
return 0;
}
int Dinic(){
int ans=0,k;
while(bfs())
while((k=dfs(s,inf)))
ans+=k;
return ans;
}
void init(int k){
memset(head,0,sizeof(head)),cnt=0;
for(int i=1;i<=n;i++)
add(i,t,b[i]);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
add(s,id[i][j],1);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
if(b[i]<b[j]&&i>n-k)
add(id[i][j],i,1);
else
if(b[i]>b[j]&&j>n-k)
add(id[i][j],j,1);
else
add(id[i][j],j,1),add(id[i][j],i,1);
}
}
bool check(int k){
init(k);
return (Dinic()==n*(n-1)/2);
}
char c[100001];
int main(){
int T;
scanf("%d%*c",&T);
while(T--){
int tot=0;n=0;
gets(c);
for(int i=0;i<strlen(c);i++){
if(i==0)
b[++n]=c[i]-'0';
else
if(c[i-1]==' '&&c[i]>='0'&&c[i]<='9')
b[++n]=c[i]-'0';
else
if(c[i-1]>='0'&&c[i-1]<='9'&&c[i]>='0'&&c[i]<='9')
b[n]=b[n]*10+c[i]-'0';
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
id[i][j]=id[j][i]=++tot+n;
for(int i=n;i;i--)
if(check(i)){ printf("%d\n",i);break;}
}
}

「POJ 2699」The Maximum Number of Strong Kings的更多相关文章

  1. 【POJ】【2699】The Maximum Number of Strong Kings

    网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...

  2. POJ 2699 The Maximum Number of Strong Kings Description

    The Maximum Number of Strong Kings   Description A tournament can be represented by a complete graph ...

  3. POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)

    The Maximum Number of Strong Kings Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2488 ...

  4. POJ2699 The Maximum Number of Strong Kings

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2102   Accepted: 975 Description A tour ...

  5. 【POJ2699】The Maximum Number of Strong Kings(网络流)

    Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...

  6. POJ 2699 The Maximum Number of Strong Kings (最大流+枚举)

    http://poj.org/problem?id=2699 题意: 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或( v, u),表示u打败v或v ...

  7. POJ - 2699 The Maximum Number of Strong Kings (最大流+枚举)

    题意:有n(n<=10)个选手,两两之间打比赛,共有n*(n-1)/2场比赛,赢一场得1分.给出每个人最后的得分.求有多少个定义如下的strong king:赢了所有得分比自己高的人或本身就是分 ...

  8. poj 2699 The Maximum Number of Strong Kings 枚举 最大流

    题目链接 题意 对于一个竞赛图(有向完全图),其顶点是选手,边是比赛,边\(e=(u,v)\)代表该场比赛中\(u\)战胜\(v\). 现定义选手的分数为其战胜的人的个数(即竞赛图中点的出度).并且定 ...

  9. POJ 2699 The Maximum Number of Strong Kings ——网络流

    一定存在一种最优方案,使得分数前几个人是SK 所以我们可以二分答案或者枚举,然后就是经典的网络流建模. 另:输入很Excited #include <cstdio> #include &l ...

随机推荐

  1. php字符串截取函数,支持中文截取

    /** * 基于PHP的 mb_substr,iconv_substr 这两个扩展来截取字符串,中文字符都是按1个字符长度计算: * 该函数仅适用于utf-8编码的中文字符串. * * @param ...

  2. 转载:细说oracle 11g rac 的ip地址

    本文转载自:细说oracle 11g rac 的ip地址 http://blog.sina.com.cn/s/blog_4fe6d4250102v5fa.html 以前搭建oracle rac的时候( ...

  3. PCB打样前的注意事项

    0.画板前,在制定规则的时候,一定要查看生产厂家的生产工艺.  (厂家能打几层板.最小间距.焊盘最小和最大尺寸等等) 1.查看焊盘的孔径是否合适.  (检查能否插进去) 2.仔细检查购买的三端器件的引 ...

  4. Chrome和IE的xss过滤器分析总结

    chrome的xss过滤器叫xssAuditor,类似IE的xssFilter,但是他们有很大的内在区别 chrome xssAuditor工作原理 chrome的xss检测名称为 xssAudito ...

  5. Ceph recover的速度控制

    前言 磁盘损坏对于一个大集群来说,可以说是必然发生的事情,即使再小的概率,磁盘量上去,总会坏那么几块盘,这个时候就会触发内部的修复过程,修复就是让不满足副本要求的PG,恢复到满足的情况 一般是踢掉坏盘 ...

  6. Flask 数据库多对多关系

    数据库使用关系建立记录之间的联系.其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起.实现这种关系时,要在“多”这一侧加入一个外键,指向“一”这一侧联接的记录.大部分的其他关系 ...

  7. Python函数的初识

    一   什么是函数 定义: 定义一个事情或者功能,等到需要用的时候直接用就可以了,那么这个定义的就是一个函数 函数  :  对代码块和功能的封装和定义 函数定义的格式:     def   函数名() ...

  8. TensorFlow模型保存和提取方法

    一.TensorFlow模型保存和提取方法 1. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提取.tf.train.Saver对象saver的save方法将Tens ...

  9. 201671010127 2016-2017-8 回谈static修饰符

    上周学了泛型程序程序设计技术,再一次接触到了静态方法,那么今天就来谈一下static修饰符. static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块, ...

  10. 【HDU4303】Hourai Jeweled

    题意 有一棵n个结点的树,每个结点都有一个值,没一条边都有一个颜色.如果某条路径上,相邻的边颜色不同,那么把这路径上所有的点的值加起来. 输出所有符合条件的路径上值的和. n<=300000. ...