首页 > 其他分享 >竞赛图初探 || CF1779E Anya's Simultaneous Exhibition - 竞赛图 - 交互 -

竞赛图初探 || CF1779E Anya's Simultaneous Exhibition - 竞赛图 - 交互 -

时间:2023-01-26 22:22:49浏览次数:67  
标签:兰道 竞赛 int 出度 CF1779E long Simultaneous binom

题目链接:https://codeforces.com/contest/1779/problem/E

题解:
将一个完全图的每条边定向,构成的有向图叫做 竞赛图
也很好理解,\(n\) 个人两两比赛,肯定有胜有负,赢家向负者连边,就构成了这张图。

竞赛图有一些有用的性质:

  • 缩点后拓扑序唯一(也可以简单理解成构成一条链)
  • (兰道定理)将所有点的出度 \(s_i\) 升序排列,那么 \(\sum_{i=1}^ks_i \geq \binom{k}{2}\),而且 \(k=n\) 的时候必取等
    证明可以考虑 \(1..k\) 的所有人两两比赛(不考虑其余人),必然有胜者 \(i\),也就是 \(s_i\) +1,这一共进行 \(\binom{k}{2}\) 场比赛,因此 \(\sum s_i\) 至少是 \(\binom{k}{2}\)
    可以感性理解成最“菜”的 \(k\) 个人自己就能构成一个竞赛图(除去外边人的干扰),求的是出度是因为入度会有其它人的干扰
  • 若有环,则必有三元环(证明可以用染色之类的证吧,画几个 \(n=4/5\) 的情况看看就行了)

本题中,可以发现所要求的就是缩点之后拓扑序最小的那个点对应的原图强连通分量里的点
如何找这个强连通分量呢?想到兰道定理
但是兰道定理关注的是最“菜”的,但是现在要求最“强”的。我们可以借助感性理解。把最强的几个点(每次查询除自己外其它所有点得到出度,把出度按从大到小排序)拿出来,去掉其它的点,关注一下这个子图所有点的入度(不要出度是因为会与其它点相关,这和兰道定理的时候正好反过来了),同理如果入度是 \(\binom{k}{2}\) 的形式就说明这是个强连通分量,而且是拓扑序最小的。

代码:

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 2e5+5;

int n;
struct node{int out,id;}de[maxn];
int cmp(node a,node b){return a.out>b.out;}

int check(int in){
	in<<=1;
	int sq = (int)sqrt(1.0 * in+0.5);
	return sq*(sq+1) == in;
}

int res[maxn];
signed main(){
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++){
		printf("? %d ",i);
		for(int j=1;j<=n;j++)printf("%d",i!=j);
		puts("");fflush(stdout);
		scanf("%d",&de[i].out);de[i].id = i;
	}
	sort(de+1,de+n+1,cmp);
	int ans=n;
	int in=0;
	for(int i=1;i<=n;i++){
		in += (n-1) - de[i].out;
		int rst = i;
		if(in == rst*(rst-1)/2){ans = i;break;}
	}
	
	for(int i=1;i<=ans;i++)res[de[i].id] = 1;
	printf("! ");for(int i=1;i<=n;i++)printf("%d",res[i]);fflush(stdout);

	return 0;
}

标签:兰道,竞赛,int,出度,CF1779E,long,Simultaneous,binom
From: https://www.cnblogs.com/SkyRainWind/p/17068333.html

相关文章

  • 算法竞赛向 C++ Standard Library 使用速查
    因网络上STL教程大多零散且缺乏严谨性,本文对算法竞赛所需C++StandardLibrary做了一个较为全面的总结。全文主要参考以下文档:Containerslibrary-cppreference.c......
  • 308. 最廉价的回文串 Cheapest Palindrome(挑战程序设计竞赛)
    地址https://www.papamelon.com/problem/308给定一个长度为m(m≤2000)的小写字母字符串,在给定组成该字符串的n(n≤26)个字符的添加和删除费用,求使原字符串变为......
  • 2023年江苏省大学生数学竞赛
    考试信息2023年4月29日前:全省各参赛院校将参加省赛的学生人数和参赛名单提交2023年5月27日:竞赛时间开始准备:最迟2月底本科一级A:一元与多元微积分,空间解析几何,数项级数......
  • 如何用Python参加算法竞赛
    如何用Python参加算法竞赛前言本文适合有一定c++基础且初步了解Python,并想开发自己第二竞赛用语言的人群阅读。本文仅介绍Python3,更低版本Python请自行了解。Python的......
  • 225. 多重集组合数(挑战程序设计竞赛)
    地址https://www.papamelon.com/problem/225有n种物品,第i种物品有a_i个。不同种类的物品可以互相区分但相同种类的无法区分。从这些物品中取出m个物品的话,有多少......
  • 224. 划分数(挑战程序设计竞赛)
    地址https://www.papamelon.com/problem/224有n个无区别的物品,将它们划分成不超过m组,求划分方法数模M的余数输入输入第一行有三个整数n、m、M1≤m≤n≤100......
  • 223. 最长上升子序列问题(挑战程序设计竞赛)
    地址https://www.papamelon.com/problem/223有一个长为n的序列a_0,a_1,...,a_n。求出这个序列的最长上升子序列的长度。上升子序列指的是对于任意的i<j都满足......
  • 222. 多重部分和问题(挑战程序设计竞赛)
    地址https://www.papamelon.com/problem/222有n种不同大小的数字a_i,每种各m_i个。判断是否可以从这些数字之中选出若干个并使得它们的和恰好为K输入第一行包含......
  • 《随机算法在信息学竞赛中的应用》做题记录
    目录《随机算法在信息学竞赛中的应用》做题记录MSTONESProblemSolutionP3567[POI2014]KUR-CouriersProblemSolutionCF364DGhdProblemSolutionTKCONVEXProblemSolutionP12......
  • 竞赛图
    竞赛图,是每两个点之间都有一条有向边的图。因为有一种模型是两者之间比赛谁能赢,赢的人对输的人连一条边,因此叫做竞赛图。竞赛图的性质:对SCC缩点之后是一条链式结构,类......