0%

思路讲解

先把所有点替换为其父节点,然后使用

LCAa1,a2=a1(a1为深度较浅点)a11>a2的路径上LCA(a1,a2)=a1(a1为深度较浅点)\Rightarrow a1在1->a2的路径上这个结论。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int i=1;i<=M;++i){
sort(que[i].begin(),que[i].end(),cmp);
for(int j=0;j<que[i].size();++j){
que[i][j]=Fa[que[i][j]];
}
ll din=in[que[i].back()],dout=out[que[i].back()];
bool isB=false;
for(int j=(int)que[i].size()-2;j>=0;--j){
ll node=que[i][j];
if(in[node]<=din && out[node]>=dout){ // node是不是最深点的父节点?

}else{
cout<<"NO\n";isB=true;
break;
}
}
if(!isB)cout<<"YES\n";
}

AC代码

https://codeforces.com/group/vXvHT09g9Y/contest/1328/submission/327207452

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

思路讲解

我们这里有一个很好的分离:在将每条边设置为0 的 MST 查询之后,发生变化的那些边正是权重为1 的边。可以用这种方法找到权重为1的所有边,使用M次询问。

但是这有一个前提,就是这条边必须是两个联通分量的唯一连接,否则如果有其他连接,其他连接都是0,最小生成树就是0,无法判断了。

那么我个人认为,其实就是能找出所有的1,然后剩余的都是0就行了。

AC代码

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

思路讲解

直接计算有值最长前缀。

AC代码

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

思路讲解

看了题解以后,我们发现有些时候我们不一定要全部依赖树状dp得出答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
auto dfs=[&](auto &&self,ll u,ll cur,ll gain,ll de)->void{    // 在外面调用的时候dfs(dfs,u)
vis[u]=true;dp[u]=cur;
for(int i=0;i<g[u].size();++i){
ll v=g[u][i][0],w=g[u][i][1];
if(vis[v]) continue;
if(cur+gain+A[u]-de>=w){
self(self,v,cur,gain+A[u],de+w);
}else{
self(self,v,w-gain-A[u]+de,gain+A[u],de+w);
}
}
for(int i=0;i<g[u].size();++i){
ll w=g[u][i][1],v=g[u][i][0];
if(w*2<A[u]+A[v] && A[u]>=w){
inf.push_back(dp[u]); // 无限循环所需要的值
break;
}
}
};

AC代码

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=78031630

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