[题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理
本题需要用到的结论:
一.兰道定理
二.如果\(n\geq4\),那么\(n\)个点的强连通竞赛图存在\(n-1\)个点的强连通子图。
证明:
现在有一个n-1个点的竞赛图(不一定强连通,称其为原图),加入n号点,得到的n个点的竞赛图是强连通的。将原图强连通分量分解,按照拓扑序排好,称为\(a_0 \cdots a_k\)(一共k个强连通分量)。现在考虑证明加入n号点后的图,删掉某一个点后一定可以得到强连通图。
k=1:去掉n号点即可。
\(k \geq 3\):原图是长成这样的(不太准确,看个大概就行):

也就是每两个分量之间都有从前到后的边。现在加入n号点,形成强连通图,既然强连通,那么\(a_k\)到n肯定有边,n到\(a_0\)也肯定有边。可以在任意一个\(a_i(0<i<k)\)中任选一个点删掉,这时任意两个点u和v(\(u,v \neq n\))仍然可以通过\(u \to a_k \to n \to a_0 \to v\)的方式到达。n号点和其他点之间显然可以任意到达。k=2 因为\(n \geq 4\),所以两个分量里一定有至少一个有>1个元素,我们选择元素>1个的分量,从里面删一个点。以删\(a_1\)中的点为例,在\(a_1\)中随便挑一个到n有边的点r,因为\(a_1\)强连通,所以能够在\(a_1\)中选出一个以r为根的"反向"生成树:

在这个生成树里任意选一个叶子删掉,可以发现不影响任意两个节点之间的可达性。删除\(a_0\)中的点也是一样证明的,只是生成树变成了正向的。到这里2号结论就证完了。
三. \(n \geq 4\)时,n个点的强连通竞赛图可以翻转一个点,使得操作后的图仍然强连通。
根据结论二,可以先找出n-1个点的强连通子图,把剩下的1个点翻转即可。
四. \(n \geq 7\)时可以翻转至多1个点使图强连通。
证明:
还是像上面的证明一样把scc的拓扑序列出来
- k=1 不需翻转直接合法
- \(k \geq 3\),任选一个i满足\(0<i<k\),翻转\(a_i\)中的一个点x,发现任意u,v(\(u,v \neq x\))都有路径\(u \to a_k \to x \to a_0 \to v\);x和其他节点之间显然也是可以互相到达的。
- k=2 \(a_0和a_1\)必有一个分量大小\(\geq 4\),假设\(a_1\)大小\(\geq 4\),根据结论三,在里面可以翻转一个点,使得\(a_1\)仍然强连通,且整个图产生环,变为强连通图。
有了这些结论这题就基本做完了,\(n\leq 6\)的暴力枚举翻转的点集,其余情况枚举翻转哪一个节点或者是不翻转,检查的时候直接用兰道定理就可以了。
时间复杂度\(O(n^2log_2n)\)。
点击查看代码
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair
using namespace std;
int n,D[2010];
string s[2010];
char c[2010];
bool check(vector <int> v)
{
sort(v.begin(),v.end());
int sum=0;
rep(i,v.size()-1)
{
sum+=v[i];
if(sum==i*(i+1)/2) return false;
}
return true;
}
bool isGood(int msk)
{
int d[10],sw[10];
rep(i,10) d[i]=0;
rep(i,n) sw[i]=((msk&(1<<i))>0 ? 1:0);
rep(i,n) rep(j,i)
{
int dir=(s[i][j]-'0')^sw[i]^sw[j];
if(dir==1) ++d[j];
else ++d[i];
}
vector <int> v;rep(i,n) v.pb(d[i]);
return check(v);
}
bool isGood2(int id)
{
int d[2010];
rep(i,n) d[i]=D[i];
if(id>-1)
{
rep(i,n) if(i!=id)
{
int dir=(s[id][i]-'0')^1;
if(dir==1) ++d[i],--d[id];
else --d[i],++d[id];
}
}
vector <int> v;rep(i,n) v.pb(d[i]);
return check(v);
}
int main()
{
freopen("rv.in","r",stdin);
freopen("rv.out","w",stdout);
cin>>n;
rep(i,n)
{
scanf("%s",c);
s[i]=c;
}
if(n<=6)
{
pii ans=mpr(1e9,0);
rep(i,1<<n) if(isGood(i))
{
int res=__builtin_popcount(i),vv=1;
repn(j,res) vv*=j;
if(res<ans.fi) ans=mpr(res,vv);
else if(res==ans.fi) ans.se+=vv;
}
if(ans.se==0) puts("-1");
else cout<<ans.fi<<' '<<ans.se<<endl;
}
else
{
rep(i,n) rep(j,i)
{
int dir=(s[i][j]-'0');
if(dir==1) ++D[j];
else ++D[i];
}
if(isGood2(-1)) puts("0 1");
else
{
int ans=0;
rep(i,n) if(isGood2(i)) ++ans;
cout<<1<<' '<<ans<<endl;
}
}
return 0;
}
[题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理的更多相关文章
- [题解] Codeforces 1720 E Misha and Paintings 结论
题目 算是诈骗题? 令一开始就存在的颜色数为cnt.k>=cnt的情况,显然每次找一个出现不止一次的颜色,然后把这个颜色的恰好一个方块替换成一种没有出现过的颜色就可以了,\(k-cnt\)次解决 ...
- Educational Codeforces Round 8 A. Tennis Tournament 暴力
A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...
- Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】
题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...
- [题解][Codeforces]Good Bye 2019 简要题解
构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- [题解] Codeforces Round #549 (Div. 2) B. Nirvana
Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...
- 题解——CodeForces 438D The Child and Sequence
题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...
- [题解][Codeforces]Codeforces Round #602 (Div. 1) 简要题解
orz djq_cpp lgm A 题意 给定一个分别含有 \(\frac n2\) 个左括号和右括号的括号序列 每次可以将序列的一个区间翻转 求一个不超过 \(n\) 次的操作方案,使得操作完之后的 ...
- [题解]Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) - A. Basic Diplomacy
[题目] A. Basic Diplomacy [描述] Aleksey有n个朋友,有一个m天的假期,每天都需要一个朋友来陪他.给出每天有空的朋友的编号,要求同一个朋友来的天数不能超过m/2上取整.求 ...
随机推荐
- NOI / 2.1基本算法之枚举-8759:火车上的人数
8759:火车上的人数 总时间限制: 1000ms 内存限制: 65536kB 描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下 ...
- Trie树模板1字符串统计
Trie树模板1字符串统计 我们首先来了解一下字典树,首先看一下一张字典树的图片 字典树就是一个可以高效存储.查找字符串的树,比如上面这个字典树就是存储abc,acb,bac的字典树. 1.插入操作( ...
- Linux—系统基础一
Linux系统基础(一) Linux的基本原则: 由目的单一的小程序组成,组合小程序完成复杂任务: 一切皆文件: 配置文件保存为纯文本格式. 1.shell 1.1 shell简介 Shell俗称壳( ...
- 开源一个自动整理B站UWP客户端软件进行批量下载的视频文件的小工具BiliVideosReoganizeHelper
大家都知道B站是一个很受欢迎的视频学习网站,上面有很多无私的up主上传了大量优秀的教学视频,在此向B站致敬,向广大UP主致敬. 有时,我们需要下载收藏一些视频,以防止以后找不到了.那么我们可以用B ...
- vue原理相关
vue原理三大模块:响应式.vdom和diff.模板编译 vue原理要点: 1.组件化 组件化的历史:在vue之前已经有组件化的概念了,想asp.jsp.php等就有组件化的概念,nodejs也有组件 ...
- 一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现
让我们来到微观世界重新认识 Netty 在前面 Netty 源码解析系列 <聊聊 Netty 那些事儿>中,笔者带领大家从宏观世界详细剖析了 Netty 的整个运转流程.从一个网络数据包在 ...
- ROS机械臂 Movelt 学习笔记5 | MoveIt Commander Scripting
前一讲python接口中提到moveit_commander 包.这个包提供了用于运动规划.笛卡尔路径计算以及拾取和放置的接口. moveit_commander 包还包括一个命令行接口程序movei ...
- Luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers (贪心,二分,数据结构优化)
贪心 考场上因无优化与卡常T掉的\(n \log(n)\) //#include <iostream> #include <cstdio> #include <cstri ...
- ZZH与计数(矩阵加速,动态规划,记忆化搜索)
题面 因为出题人水平很高,所以这场比赛的题水平都很高. ZZH 喜欢计数. ZZH 有很多的数,经过统计,ZZH一共有 v 0 v_0 v0 个 0 , v 1 v_1 v1 个 1,-, v 2 ...
- APICloud AVM框架 封装车牌号输入键盘组件
AVM(Application-View-Model)前端组件化开发模式基于标准Web Components组件化思想,提供包含虚拟DOM和Runtime的编程框架avm.js以及多端统一编译工具,完 ...