这是一份60分的代码,WA in 1,10,TLE in 8,9.
#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
void dfs(int t){
for(int i=h[t];i;i=sd[i].ne){
if(sd[i].v!=fa[t]){
fa[sd[i].v]=lca[sd[i].v][0]=t;
s[sd[i].v]=s[t]+1;
dfs(sd[i].v);
}
}
}
int lcc(int a,int b){
if(s[a]<s[b]){
swap(a,b);
}
for(int i=20;i>=0;i--){
if(s[lca[a][i]]>=s[b]){
a=lca[a][i];
}
}
if(a==b){
return a;
}
for(int i=20;i>=0;i--){
if(lca[a][i]!=lca[b][i]){
a=lca[a][i];
b=lca[b][i];
}
}
return fa[a];
}
int x,y,z;
int jl(int a,int b){
int c;
c=lcc(a,b);
return s[a]-s[c]+s[b]-s[c];
}
int zjl(int s){
return jl(x,s)+jl(y,s)+jl(z,s);
}
signed main(){
std::ios::sync_with_stdio(0);
cin>>n>>q;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
swap(u,v);
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
}
dfs(1);
for(int i=1;i<=20;i++){
for(int j=1;j<=n;j++){
lca[j][i]=lca[lca[j][i-1]][i-1];
}
}
for(int i=1;i<=q;i++){
cin>>x>>y>>z;
int ans,aa;
ans=0;
aa=lcc(x,y);
ans=zjl(aa);
if(zjl(lcc(x,z))<ans){
aa=lcc(x,z),ans=zjl(aa);
}
if(zjl(lcc(y,z))<ans){
aa=lcc(y,z),ans=zjl(aa);
}
cout<<aa<<" "<<ans<<endl;
}
return 0;
}
显然,常数太大,但是不知道哪里WA,接下来就是神奇的操作了。
看题解后进行了小修改,将末尾修改。
90分,WA in 1.
#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
inline void dfs(register int t){
for(register int i=h[t];i;i=sd[i].ne){
if(sd[i].v!=fa[t]){
fa[sd[i].v]=lca[sd[i].v][0]=t;
s[sd[i].v]=s[t]+1;
dfs(sd[i].v);
}
}
}
inline int lcc(register int a,register int b){
if(s[a]<s[b]){
swap(a,b);
}
for(register int i=20;i>=0;i--){
if(s[lca[a][i]]>=s[b]){
a=lca[a][i];
}
}
if(a==b){
return a;
}
for(register int i=20;i>=0;i--){
if(lca[a][i]!=lca[b][i]){
a=lca[a][i];
b=lca[b][i];
}
}
return fa[a];
}
int x,y,z;
signed main(){
std::ios::sync_with_stdio(0);
cin.tie(0);//小优化对AC与WA影响不大
cin>>n>>q;
for(register int i=1;i<n;i++){
register int u,v;
cin>>u>>v;
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
swap(u,v);
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
}
dfs(1);
for(register int i=1;i<=20;i++){
for(register int j=1;j<=n;j++){
lca[j][i]=lca[lca[j][i-1]][i-1];
}
}
for(register int i=1;i<=q;i++){
cin>>x>>y>>z;
register int ans,a1,a2,a3,aa;
ans=0;
a1=lcc(x,y);//修改部分
a2=lcc(y,z);
a3=lcc(x,z);
if(a1==a2){
aa=a3;
}
if(a1==a3){
aa=a2;
}
if(a3==a2){
aa=a1;
}
ans=s[x]+s[y]+s[z]-s[a1]-s[a2]-s[a3];//修改结束
cout<<aa<<" "<<ans<<"\n";
}
return 0;
}
接着我开始瞎搞,修改了默认根节点编号,90pts,WA in 10。
#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
inline void dfs(register int t){
for(register int i=h[t];i;i=sd[i].ne){
if(sd[i].v!=fa[t]){
fa[sd[i].v]=lca[sd[i].v][0]=t;
s[sd[i].v]=s[t]+1;
dfs(sd[i].v);
}
}
}
inline int lcc(register int a,register int b){
if(s[a]<s[b]){
swap(a,b);
}
for(register int i=20;i>=0;i--){
if(s[lca[a][i]]>=s[b]){
a=lca[a][i];
}
}
if(a==b){
return a;
}
for(register int i=20;i>=0;i--){
if(lca[a][i]!=lca[b][i]){
a=lca[a][i];
b=lca[b][i];
}
}
return fa[a];
}
int x,y,z;
signed main(){
std::ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
for(register int i=1;i<n;i++){
register int u,v;
cin>>u>>v;
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
swap(u,v);
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
}
dfs(2);//改了个数
for(register int i=1;i<=20;i++){
for(register int j=1;j<=n;j++){
lca[j][i]=lca[lca[j][i-1]][i-1];
}
}
for(register int i=1;i<=q;i++){
cin>>x>>y>>z;
register int ans,a1,a2,a3,aa;
ans=0;
a1=lcc(x,y);
a2=lcc(y,z);
a3=lcc(x,z);
if(a1==a2){
aa=a3;
}
if(a1==a3){
aa=a2;
}
if(a3==a2){
aa=a1;
}
ans=s[x]+s[y]+s[z]-s[a1]-s[a2]-s[a3];
cout<<aa<<" "<<ans<<"\n";
}
return 0;
}
最后,我又换了根,A了(但是显然是数据的原因)。
#include<bits/stdc++.h>
using namespace std;
int n,q;
struct st{
int v,ne;
}sd[1000009];
int inn;
int h[500009];
int fa[500009];
int s[500009];
int lca[500009][29];
inline void dfs(register int t){
for(register int i=h[t];i;i=sd[i].ne){
if(sd[i].v!=fa[t]){
fa[sd[i].v]=lca[sd[i].v][0]=t;
s[sd[i].v]=s[t]+1;
dfs(sd[i].v);
}
}
}
inline int lcc(register int a,register int b){
if(s[a]<s[b]){
swap(a,b);
}
for(register int i=20;i>=0;i--){
if(s[lca[a][i]]>=s[b]){
a=lca[a][i];
}
}
if(a==b){
return a;
}
for(register int i=20;i>=0;i--){
if(lca[a][i]!=lca[b][i]){
a=lca[a][i];
b=lca[b][i];
}
}
return fa[a];
}
int x,y,z;
signed main(){
std::ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
for(register int i=1;i<n;i++){
register int u,v;
cin>>u>>v;
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
swap(u,v);
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
}
dfs(3);//改了个数
for(register int i=1;i<=20;i++){
for(register int j=1;j<=n;j++){
lca[j][i]=lca[lca[j][i-1]][i-1];
}
}
for(register int i=1;i<=q;i++){
cin>>x>>y>>z;
register int ans,a1,a2,a3,aa;
ans=0;
a1=lcc(x,y);
a2=lcc(y,z);
a3=lcc(x,z);
if(a1==a2){
aa=a3;
}
if(a1==a3){
aa=a2;
}
if(a3==a2){
aa=a1;
}
ans=s[x]+s[y]+s[z]-s[a1]-s[a2]-s[a3];
cout<<aa<<" "<<ans<<"\n";
}
return 0;
}
提交了两页多,帮帮我吧。