sb操做反思

模擬測試72node

對拍發現暴力掛了,沒改暴力繼續拍,直接交了,正解掛成15c++

對拍是人類進步的階梯ide

必定要拍,不拍就掛,測試

要對本身代碼水平心中有b數spa

要對本身代碼習慣心中有b數code

模擬測試73blog

不要相信大樣例,大樣例對了,你的程序也有可能鍋掉,內存

模擬題千萬不要複製粘貼

模擬測試74it

set不可重,multisetio

模擬測試87

暴力和(僞)正解犯的同一個sb錯誤0分

不要過於相信對拍

模擬測試87改題

不開multiset見祖宗

(一場掛100)*2

 

 

 

 

 

 又是過於相信對拍

暴力要重碼不要在你打的正解基礎上改

模擬測試94

炸內存了

100掛成0

沒事不要全開long long

注意空間,

 

 

 

 

打模擬對拍若是方便重構能夠再打一遍,第一遍拍第二遍

少清空一個r

這種錯誤還在犯

 

卻是避免了多測不清空........................................................

 

WA0代碼

AC代碼

正解掛成0

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 610000
ll head[A],ver[A],nxt[A],edg[A],maxx[A][21],f[A][21],fa[A],dep[A];
ll t,tot,n,m,q;
struct node{
    ll x,y,z;
    friend bool operator < (const node &a,const node &b){
        return a.z<b.z;
    }
}e[A];
ll find(ll x){
    if(fa[x]!=x) fa[x]=find(fa[x]);
    return fa[x];
}
void add(ll x,ll y,ll z){
    nxt[++tot]=head[x],head[x]=tot,ver[tot]=y;edg[tot]=z;
}
void merge(ll x,ll y){
    x=find(x),y=find(y);
    if(x!=y){
        fa[x]=y;
    }
}
ll lca(ll x,ll y){
    ll maxn=0;
    if(dep[x]>dep[y]) swap(x,y);
    for(ll i=t;i>=0;i--){
        if(dep[x]<=dep[f[y][i]]){
            maxn=max(maxn,maxx[y][i]);
            y=f[y][i];
        }
        if(dep[x]==dep[y]) break;
    }
    if(x==y) return maxn;
    for(ll i=t;i>=0;i--){
        if(f[x][i]!=f[y][i]){
            maxn=max(maxn,maxx[x][i]);
            maxn=max(maxn,maxx[y][i]);
            x=f[x][i],y=f[y][i];
        }
    }
    return maxn;
}
void dfs(ll x,ll pre){
    for(ll i=head[x];i;i=nxt[i]){
        ll y=ver[i];
        if(y==pre) continue ;
        f[y][0]=x;
        maxx[y][0]=edg[i];
        dep[y]=dep[x]+1;
        dfs(y,x);
    }
}
int main(){
    freopen("graph.in","r",stdin);
    freopen("graph.out","w",stdout);
    scanf("%lld%lld%lld",&n,&m,&q);
    t=log(n)/log(2)+1;
    for(ll i=1;i<=n;i++) fa[i]=i;
    for(ll i=1;i<=m;i++){
        scanf("%lld%lld%lld",&e[i].x,&e[i].y,&e[i].z);
    }
    sort(e+1,e+m+1);
    for(ll i=1;i<=m;i++){
        ll x=e[i].x,y=e[i].y;
        x=find(x),y=find(y);
        if(x!=y){
            merge(x,y);
            add(e[i].x,e[i].y,e[i].z);
            add(e[i].y,e[i].x,e[i].z);
        }
    }
    f[1][0]=1;dfs(1,0);
    for(ll j=1;j<=t;j++){
        for(ll i=1;i<=n;i++){
            ll now=f[i][j-1];
            f[i][j]=f[now][j-1];
            maxx[i][j]=max(maxx[now][j-1],maxx[i][j-1]);
        }
    }
    for(ll i=1;i<=q;i++){
        ll x,y,xx,yy;
        scanf("%lld%lld",&x,&y);
        if(find(x)!=find(y)){
            printf("-1\n");
        }
        else {
            printf("%lld\n",lca(x,y));
        }
    }
}
View Code

 

倍增必定要注意直接與lca相連的邊

相關文章
相關標籤/搜索