模擬測試72node
對拍發現暴力掛了,沒改暴力繼續拍,直接交了,正解掛成15c++
對拍是人類進步的階梯ide
必定要拍,不拍就掛,測試
要對本身代碼水平心中有b數spa
要對本身代碼習慣心中有b數code
模擬測試73blog
不要相信大樣例,大樣例對了,你的程序也有可能鍋掉,內存
模擬測試74it
set不可重,multisetio
模擬測試87
暴力和(僞)正解犯的同一個sb錯誤0分
模擬測試87改題
(一場掛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)); } } }