0%

思路讲解

其实不难,理解之后写起来还是挺简单的。

先是小T了一下,然后上了读写优化就好了。

AC代码

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

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

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

TLE

思路讲解

像这种题目,一般来说是通过一些离线想法,比如排序什么的,然后运用一些数据结构计算端点的数量

这道题目本质上是要离线计算相交而不包含的区间数量

通过离线,保证一个端点一定符合要求,另一个端点数量使用树状数组求出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ll idx=1;
FOR(i,1,Q){
ll l=que[i][0],r=que[i][1],ind=que[i][2];
while(idx<=M){
// 我们保证了实线r大于虚线r。
if(lr[idx][1]<r){
break;
}
trl.add(lr[idx][0],1);
++idx;
}
// 要求实线l小于虚线r大于虚线l
Ans[ind]=trl.query(l,r);
}
sort(que+1,que+1+Q);
sort(lr+1,lr+1+M);
idx=1;
FOR(i,1,Q){
ll l=que[i][0],r=que[i][1],ind=que[i][2];
while(idx<=M){
// 我们保证了实线l小于虚线l。
if(lr[idx][0]>l){
break;
}
trr.add(lr[idx][1],1);
++idx;
}
// 要求实线l小于虚线r大于虚线l
Ans[ind]+=trr.query(l,r);
}

AC代码

https://atcoder.jp/contests/abc405/submissions/66033424

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

思路讲解

判断树上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……)