0%

思路讲解

判断树上a到b路径和c到d路径是否相交。

有一个小结论,就是如果两条路径相交,那么相交点至少是其中一条路径的最近公共祖先。

image

一呢,我们去构造反例,发现不太行,如果把那两个凸出来的点连接在一起就成环了。

那么我们发现如果不能连的话,相交点就成根节点了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//        保证共线
if(LCA(lcaAB,lcaCD)==lcaCD && LCA(c,lcaAB)==lcaAB){
cout<<"Y\n";
continue;
}
if(LCA(lcaAB,lcaCD)==lcaCD && LCA(lcaAB,d)==lcaAB){
cout<<"Y\n";
continue;
}
// ----------
// 看lcaCD在不在a->lcaAB上
if(LCA(lcaCD,lcaAB)==lcaAB && LCA(lcaCD,a)==lcaCD){
cout<<"Y\n";
continue;
}
if(LCA(lcaCD,lcaAB)==lcaAB && LCA(lcaCD,b)==lcaCD){
cout<<"Y\n";
continue;
}

AC代码

https://www.luogu.com.cn/record/217989209

心路历程(WA,TLE,MLE……)

WA

https://www.luogu.com.cn/record/217981621

主要是无法处理这种情况。

image

思路讲解

AC代码

心路历程(WA,TLE,MLE……)

思路讲解

就是拉姆齐定理的简单应用

N≥6 一定是 Bad Team。≤5,枚举一下就行

1
2
3
4
5
6
7
8
9
10
11
12
13
if(N<=5){
FOR(i,1,N)
FOR(j,i+1,N)
FOR(k,j+1,N){
if(G[i][j]+G[i][k]+G[j][k]==0 || G[i][j]+G[i][k]+G[j][k]==3){
cout<<"Bad Team!\n";
return;
}
}
cout<<"Great Team!\n";
}else{
cout<<"Bad Team!\n";
}

AC代码

https://vjudge.net/solution/60815052

心路历程(WA,TLE,MLE……)

思路讲解

根据 Ramsey定理,大于等于6个的集合,肯定存在一个子集的边都是红色或者都是蓝色,即为团还是为孤立点;

即6 个人中至少存在3人相互认识或者相互不认识。

1
2
3
4
FOR(i,6,N){		// 根据Ramsey定理的结论
ans+=C(N,i);
ans%=mod;
}

然后3-5个点的枚举就可以了

AC代码

https://vjudge.net/solution/60814540

心路历程(WA,TLE,MLE……)

小心 infrac[0]=0;

1
2
3
4
infrac[0]=1;
FOR(i,1,50){
infrac[i]=binpow(frac[i],mod-2);
}

思路讲解

image

image

隔板法

如果说有maxA个挡板,至少要有maxA-1个数才能让隔板不相邻。

AC代码

https://vjudge.net/solution/60783771

心路历程(WA,TLE,MLE……)