Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
41669 baka24 【BJ】T3 C++ 运行超时 0 11024 MS 39384 KB 5302 2026-05-27 14:05:30

Tests(0/5):


#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define LD long double #define lll __int128 #define lson (pos<<1) #define rson (pos<<1|1) #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v #define inx2(u) int I2=h[(u)],v2=edge[I2].v;I2;I2=edge[I2].nx,v=edge[I2].v #define popcnt __builtin_popcountll #define hb(x) (x?64-__builtin_clzll(x):0) #define lb(x) (x&(-x)) bool AAA; int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} void write(lll x){if(x<0)putchar('-'),x=-x;if(x<10)putchar('0'+x);else write(x/10),putchar(x%10+'0');} const int MAXN=500010,N=22,inf=1e9,Mod=998244353; inline void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;}int ad(int x,int y){return x+y>=Mod?x+y-Mod:x+y;} int Pow(int x,int y){int rt=1;if(y<0)y=Mod-2;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,k; int f[N][MAXN],lg2[MAXN],bg[MAXN],ed[MAXN],dep[MAXN],tot; int Min(int x,int y){ return dep[x]<dep[y]?x:y; } int lca(int x,int y){ int l=min(bg[x],bg[y]),r=max(ed[x],ed[y]); int g=lg2[r-l+1]; return Min(f[g][l],f[g][r-(1<<g)+1]); } void init(){ for(int i=2;i<=tot;i++)lg2[i]=lg2[i>>1]+1; for(int i=1;i<N;i++) for(int j=1;j+(1<<i)-1<=tot;j++)f[i][j]=Min(f[i-1][j],f[i-1][j+(1<<i-1)]); } void dfs(int u,int lst){ f[0][bg[u]=ed[u]=++tot]=u; for(inx(u))if(v!=lst)dep[v]=dep[u]+1,dfs(v,u),f[0][ed[u]=++tot]=u; } int dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];} int mrge(pii a,pii b){ int x=dis(a.fr,b.fr)+dis(a.sc,b.sc),y=dis(a.fr,b.sc)+dis(a.sc,b.fr),z=dis(a.fr,a.sc)+dis(b.fr,b.sc); // cout<<x<<" "<<y<<" "<<z<<endl; if(z<min(x,y))return (max({x,y,z})-min({x,y,z}))/2; else return 0; } struct segtree{ struct node{ pii x,y; int d; node operator*(const node&G)const{ if(!x.fr)return G; if(!G.x.fr)return {x,y,d}; int p1=mrge(x,G.y),p2=mrge(y,G.x),p3=mrge(x,G.x),p4=mrge(y,G.y),p5=d,p6=G.d; int tmp=max({p1,p2,p3,p4,p5,p6}); if(p1==tmp)return {x,G.y,p1}; if(p2==tmp)return {y,G.x,p2}; if(p3==tmp)return {x,G.x,p3}; if(p4==tmp)return {y,G.y,p4}; if(p5==tmp)return {x,y,p5}; if(p6==tmp)return {G.x,G.y,p6}; } }t[MAXN<<2]; void pushup(int pos){ t[pos]=t[lson]*t[rson]; } void update(int pos,int l,int r,int x,pii y){ if(l==r){ t[pos]={y,y,0}; return; } int mid=(l+r)>>1; if(x<=mid)update(lson,l,mid,x,y); if(x>mid)update(rson,mid+1,r,x,y); pushup(pos); } int qry(){return t[1].d;} }T; pii p[MAXN]; multiset<int>st; void slv(){ n=read(),m=read(); for(int i=1;i<n;i++){ int u=read(),v=read(); add_side(u,v); } dfs(1,1),init(); // cout<<mrge(mk(33,72),mk(7,12))<<endl; if(n<=2000) for(int i=1;i<=m;i++){ int op=read(); if(op==1){ int x=read(),y=read(); k++; p[k]=mk(x,y); for(int i=1;i<k;i++)if(p[i].fr)st.insert(mrge(p[k],p[i])); // T.update(1,1,m,k,mk(x,y)); } else{ int x=read(); for(int i=1;i<=k;i++)if(p[i].fr&&i!=x)st.erase(st.find(mrge(p[x],p[i]))); p[x]=mk(0,0); // T.update(1,1,m,x,mk(0,0)); } // for(int i=1;i<=k;i++){ // for(int j=i+1;j<=k;j++)if(mrge(p[i],p[j]))cout<<p[i].fr<<" "<<p[i].sc<<","<<p[j].fr<<" "<<p[j].sc<<","<<mrge(p[i],p[j])<<endl; // } // cout<<endl; printf("%d\n",st.empty()?0:((*st.rbegin())+1)/2); } else for(int i=1;i<=m;i++){ int op=read(); if(op==1){ int x=read(),y=read(); k++; // p[k]=mk(x,y); // for(int i=1;i<k;i++)if(p[i].fr)st.insert(mrge(p[k],p[i])); T.update(1,1,m,k,mk(x,y)); } else{ int x=read(); // for(int i=1;i<=k;i++)if(p[i].fr&&i!=x)st.erase(st.find(mrge(p[x],p[i]))); // p[x]=mk(0,0); T.update(1,1,m,x,mk(0,0)); } // for(int i=1;i<=k;i++){ // for(int j=i+1;j<=k;j++)if(mrge(p[i],p[j]))cout<<p[i].fr<<" "<<p[i].sc<<","<<p[j].fr<<" "<<p[j].sc<<","<<mrge(p[i],p[j])<<endl; // } // cout<<endl; // cout<<T.t[1].x.fr<<" "<<T.t[1].x.sc<<" "<<T.t[1].y.fr<<" "<<T.t[1].y.sc<<" "<<T.t[1].d<<" "<<mrge(T.t[1].x,T.t[1].y)<<endl; printf("%d\n",(T.qry()+1)/2); } // cout<<mrge(mk(49,49),mk(30,30))<<endl; } bool BBB; signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); // int _=read();while(_--) slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"<<((&AAA)-(&BBB))/1024.0/1024<<"MB\n"; return 0; }


测评信息: