[题解] 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上取整.求 ...
随机推荐
- 串口应用:遵循uart协议,发送多个字节的数据(状态机)
上一节中,我们遵循uart协议,它发送一次只能发送6/7/8位数据,我们不能随意更改位数(虽然在代码上可行),不然就不遵循uart协议了,会造成接收端无法接收. 在现实生活中,我们有时候要发的数据不止 ...
- Bika LIMS 开源LIMS集—— SENAITE的使用(用户、角色、部门)
设置 添加实验室人员,系统用户 因为创建实验室时必须选择实验室经理/主任/负责人,因此需要先创建实验室经理人员. 创建人员时输入人员姓名,可上传签名图片. 创建实验室部门 输入实验室名称.代码,选择实 ...
- B端产品需求分析与优先级判断
需求分析是产品经理工作中的重要一部分,而对B端产品经理来说,因为业务的特殊性,所以需求分析更考验产品经理的基础能力比如还原场景中业务调研的能力.需求价值分析中对价值的界定等. B端厂商的产品需求多数来 ...
- 【Meetup回顾】Apache DolphinScheduler在联通的实践和二次开发经验分享
在由 openLooKeng 社区主办,Apahce DolphinScheduler社区.Apache Pulsar 社区.示说网协办的联合 Meetup 上,来自联通数字科技的王兴杰老师分享了Do ...
- 让Python更优雅更易读(第一集)
变量和注释 1.变量 在编写变量尽量要让其清晰只给,让人清除搞清楚代码的意图 下方两段代码作用完全一样,但第二段代码是不是更容易让人理解 value = s.strip() username = in ...
- LuoguP1131 [ZJOI2007]时态同步 (树形DP,贪心)
贪心就离根最大距离 #include <iostream> #include <cstdio> #include <cstring> #include <al ...
- MyBatis 04 实战
增删改查实现 在实际使用中,MyBatis 的使用遵从一定的规范. 常用的增删改查的 MyBatis 实现如下: Mapper.xml <?xml version="1.0" ...
- 从零开始Blazor Server(14)--修改密码
目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它. 首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate ...
- BZOJ4212 神牛的养成计划 (字典树,bitset)
题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...
- [CF1538G] Gift Set (数学简单题)
题面 相信英文题面也很好理解 有 x \tt x x 个红糖, y \tt y y 个蓝糖.每一个礼包里面要么有 a \tt a a 个红糖+ b \tt b b 个蓝糖,要么是 a \tt a a ...