結果
問題 | No.529 帰省ラッシュ |
ユーザー |
![]() |
提出日時 | 2020-02-29 03:45:58 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 1,114 ms / 4,500 ms |
コード長 | 12,304 bytes |
コンパイル時間 | 1,887 ms |
コンパイル使用メモリ | 111,104 KB |
実行使用メモリ | 98,468 KB |
最終ジャッジ日時 | 2024-10-13 19:46:37 |
合計ジャッジ時間 | 15,711 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 18 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;using System.Collections.Generic;using System.Collections;using System.Collections.Specialized;using System.Linq;using System.Text;using System.IO;using System.Reflection;using static System.Math;using System.Numerics;static class Program{const int mod=(int)1e9+7;static List<int>[] li,lid;static bool[] b;static int[] h;static int[] low,ord,ga;static List<Tuple<int,int>> lia;static int z=1;static Stack<int> sk;static void Main(){Sc sc=new Sc();var s=sc.Ia;int n=s[0],m=s[1],q=s[2];li=new List<int>[n+1];b=new bool[n+1];h=new int[n+1];for(int i=1;i<=n;i++){li[i]=new List<int>();}for(int i=0;i<m;i++){var e=sc.Ia;li[e[0]].Add(e[1]);li[e[1]].Add(e[0]);}low=new int[n+1];ord=new int[n+1];ga=new int[n+1];sk=new Stack<int>();lia=new List<Tuple<int,int>>();Fu(1,0,-1);while(sk.Count>0){ga[sk.Pop()]=z;}lid=new List<int>[z+1];for(int i=1;i<=z;i++){lid[i]=new List<int>();}for(int i = 0;i<lia.Count;i++) {lid[ga[lia[i].Item1]].Add(lia[i].Item2);lid[lia[i].Item2].Add(ga[lia[i].Item1]);}int o=1;for(int i = 1;i<=z;i++) {if(lid[i].Count==1){o=i;break;}}Hld hl=new Hld(lid,o);StringBuilder sb=new StringBuilder();for(int i = 0;i<q;i++) {var e=sc.Ia;if(e[0]==1){hl.Uda(ga[e[1]],e[2]);}else{sb.Append(hl.Get(ga[e[1]],ga[e[2]])+"\n");}}Console.Write(sb);}static void Fu(int a,int g,int p){b[a]=true;ord[a]=low[a]=g;sk.Push(a);for(int i=0;i<li[a].Count;i++){if(!b[li[a][i]]){Fu(li[a][i],g+1,a);if(low[li[a][i]]==ord[li[a][i]]){lia.Add(Tuple.Create(a,z));while(sk.Peek()!=li[a][i]){ga[sk.Pop()]=z;}ga[sk.Pop()]=z;z++;}}if(li[a][i]!=p){low[a]=Min(low[li[a][i]],low[a]);}}}}public class Hld{private List<int>[] li;private List<int> lir;private List<List<int>> lia=new List<List<int>>(),lib=new List<List<int>>();private int[] da,ea,fa;private St[] st;private Avl[] avl;private int m=0,o,r,u=-1;public Hld(List<int>[] li,int o){this.li=li;int n=li.Length;this.o=o;fa=new int[n];da=new int[n];ea=new int[n];avl=new Avl[n];lir=new List<int>();Fu1(o);r=da[o];fa=new int[m];st=new St[m];for(int i = 0;i<m;i++) {st[i]=new St(lia[i].Count,true,false,0);}Fu2(r,0);}public void Uda(int a,int d){avl[a].Ud(d);if(avl[a].Ra(avl[a].cnt).n==d){st[da[a]].Ud(ea[a],d);}}public int Get(int a,int b){St.Dt p=St.du;int af=fa[da[a]],bf=fa[da[b]];while(af>bf){p=Fg(p,da[a],ea[a],lia[da[a]].Count-1);a=lir[da[a]];af--;}while(af<bf){p=Fg(p,da[b],ea[b],lia[da[b]].Count-1);b=lir[da[b]];bf--;}while(da[a]!=da[b]){p=Fg(p,da[a],ea[a],lia[da[a]].Count-1);p=Fg(p,da[b],ea[b],lia[da[b]].Count-1);a=lir[da[a]];b=lir[da[b]];}if(ea[a]<ea[b]){p=Fg(p,da[a],ea[a],ea[b]);}else{p=Fg(p,da[a],ea[b],ea[a]);}if(p.d!=0){int aa=(int)p.d;avl[lia[u][p.n]].Dl(aa);if(avl[lia[u][p.n]].cnt>0){st[u].Ud(p.n,avl[lia[u][p.n]].Ra(avl[lia[u][p.n]].cnt).n);}else{st[u].Ud(p.n,0);}return aa;}else{return -1;}}private St.Dt Fg(St.Dt p,int x,int a,int b){var e=st[x].Get(a,b);if(p.d<e.d){p=e;u=x;}return p;}private void Fu2(int a,int g){fa[a]=g;for(int i=0;i<lib[a].Count;i++){Fu2(lib[a][i],g+1);}}private void Fu1(int a){fa[a]=1;da[a]=-1;avl[a]=new Avl();int p=0;for(int i=0;i<li[a].Count;i++){if(fa[li[a][i]]==0){Fu1(li[a][i]);if(fa[p]<fa[li[a][i]]){p=li[a][i];}fa[a]+=fa[li[a][i]];}}if(fa[a]==1){lia.Add(new List<int>());lib.Add(new List<int>());lir.Add(0);lia[m].Add(a);da[a]=m;m++;}else{ea[a]=lia[da[p]].Count;lia[da[p]].Add(a);da[a]=da[p];if(li[a].Count>2||o==a){for(int i=0;i<li[a].Count;i++){if(da[li[a][i]]!=-1&&p!=li[a][i]){lir[da[li[a][i]]]=a;lib[da[a]].Add(da[li[a][i]]);}}}}}}public class St{public class Dt{public int n;public long d;public Dt(long d,int n){this.d=d;this.n=n;}public override string ToString()=>"n:"+n.ToString()+" d:"+d.ToString();}public Dt[] dat;private int m=1;private bool mm,ku;static public Dt du;private Func<Dt,Dt,bool> compare;public St(int n,bool mm,bool ku,long df){this.mm=mm;this.ku=ku;if(mm){du=new Dt(long.MinValue,-1);compare=CoMax;}else{du=new Dt(long.MaxValue,-1);compare=CoMin;}while(m<n){m<<=1;}m--;dat=new Dt[m+n+1];dat[m+n]=du;for(int i=m+n-1;i>=m;i--){dat[i]=new Dt(df,i-m);}for(int i=m-1;i>=0;i--){dat[i]=(i<<1)+1<m+n?dat[(i<<1)+1]:du;}}private bool CoMax(Dt x,Dt y){return x.d>y.d;}private bool CoMin(Dt x,Dt y){return x.d<y.d;}public void Ud(int q,long b){q+=m;if(ku){b+=dat[q].d;}dat[q].d=du.d;dat[q]=new Dt(b,q-m);q=(q-1)>>1;while(q>=0){Dt o=compare(dat[2*q+1],dat[2*q+2])?dat[2*q+1]:dat[2*q+2];if(dat[q]==o){break;}dat[q]=o;q=(q-1)>>1;}}private Dt Fdg(int a,int b,int k,int l,int r){if(r<a||b<l){return du;}if(a<=l&&r<=b){return dat[k];}Dt p=Fdg(a,b,k*2+1,l,(l+r)>>1);Dt q=Fdg(a,b,k*2+2,(l+r+1)>>1,r);return compare(p,q)?p:q;}public Dt Get(int a,int b){return Fdg(a,b,0,0,m);}}public class Avl{public class Nd{public int h=1,c=1;public readonly int n;public Nd l,r;public Nd(int n,Nd du){this.n=n;l=du;r=du;}}public Nd root,du;public int cnt=0;public Avl(){du=new Nd(int.MinValue,du);du.h=0;du.c=0;root=du;}public void Ud(int n){Nd mn=new Nd(n,du);if(root==du){root=mn;}else{Fu(root,mn);if(Abs(root.l.h-root.r.h)>1){root=Rotate(root);}}cnt++;}private void Fu(Nd t,Nd mn){t.c++;if(t.n>mn.n){if(t.l!=du){Fu(t.l,mn);if(Abs(t.l.l.h-t.l.r.h)>1){t.l=Rotate(t.l);}}else{t.l=mn;}}else{if(t.r!=du){Fu(t.r,mn);if(Abs(t.r.l.h-t.r.r.h)>1){t.r=Rotate(t.r);}}else{t.r=mn;}}t.h=Max(t.l.h,t.r.h)+1;}private Nd Rotate(Nd t){Nd nd=du;if(t.l.h>t.r.h){if(t.l.l.h>t.l.r.h){nd=t.l;t.l=t.l.r;nd.r=t;t.h=Max(t.l.h,t.r.h)+1;t.c=t.l.c+t.r.c+1;}else{nd=t.l.r;t.l.r=nd.l;nd.l=t.l;t.l.h=Max(t.l.l.h,t.l.r.h)+1;t.l.c=t.l.l.c+t.l.r.c+1;t.l=nd.r;nd.r=t;t.h=Max(t.l.h,t.r.h)+1;t.c=t.l.c+t.r.c+1;}}else{if(t.r.l.h>t.r.r.h){nd=t.r.l;t.r.l=nd.r;nd.r=t.r;t.r.h=Max(t.r.l.h,t.r.r.h)+1;t.r.c=t.r.l.c+t.r.r.c+1;t.r=nd.l;nd.l=t;t.h=Max(t.l.h,t.r.h)+1;t.c=t.l.c+t.r.c+1;}else{nd=t.r;t.r=t.r.l;nd.l=t;t.h=Max(t.l.h,t.r.h)+1;t.c=t.l.c+t.r.c+1;}}nd.h=Max(nd.l.h,nd.r.h)+1;nd.c=nd.l.c+nd.r.c+1;return nd;}public bool Dl(int n){if(cnt==0){return false;}Nd t=root;if(t.n==n){root=Fd2(root);if(cnt==0){return true;}else if(Abs(root.l.h-root.r.h)>1){root=Rotate(root);}else{root.h=Max(root.l.h,root.r.h)+1;root.c=root.l.c+root.r.c+1;}return true;}bool bo=Fd1(root,n);if(Abs(root.l.h-root.r.h)>1){root=Rotate(root);}else{root.h=Max(root.l.h,root.r.h)+1;root.c=root.l.c+root.r.c+1;}return bo;}private bool Fd1(Nd t,int n){if(t.n>n){if(t.l==du){return false;}else if(t.l.n!=n){bool bo=Fd1(t.l,n);if(Abs(t.l.l.h-t.l.r.h)>1){t.l=Rotate(t.l);}else{t.l.h=Max(t.l.l.h,t.l.r.h)+1;t.l.c=t.l.l.c+t.l.r.c+1;}return bo;}else{t.l=Fd2(t.l);t.h=Max(t.l.h,t.r.h)+1;t.c=t.l.c+t.r.c+1;return true;}}else{if(t.r==du){return false;}else if(t.r.n!=n){bool bo=Fd1(t.r,n);if(Abs(t.r.l.h-t.r.r.h)>1){t.r=Rotate(t.r);}else{t.r.h=Max(t.r.l.h,t.r.r.h)+1;t.r.c=t.r.l.c+t.r.r.c+1;}return bo;}else{t.r=Fd2(t.r);t.h=Max(t.l.h,t.r.h)+1;t.c=t.l.c+t.r.c+1;return true;}}}private Nd Fd2(Nd dn){cnt--;if(dn.l==du){return dn.r;}if(dn.r==du){return dn.l;}Nd u=dn.l;if(u.r==du){u.r=dn.r;u.h=Max(u.l.h,u.r.h)+1;u.c=u.l.c+u.r.c+1;return u;}u=Fd3(u,dn);if(Abs(dn.l.l.h-dn.l.r.h)>1){u.l=Rotate(dn.l);}else{dn.l.h=Max(dn.l.l.h,dn.l.r.h)+1;dn.l.c=dn.l.l.c+dn.l.r.c+1;}u.h=Max(u.l.h,u.r.h)+1;u.c=u.l.c+u.r.c+1;return u;}private Nd Fd3(Nd u,Nd dn){if(u.r.r!=du){Nd v=Fd3(u.r,dn);if(Abs(u.r.l.h-u.r.r.h)>1){u.r=Rotate(u.r);}else{u.r.h=Max(u.r.l.h,u.r.r.h)+1;u.r.c=u.r.l.c+u.r.r.c+1;}return v;}else{Nd v=u.r;u.r=u.r.l;v.l=dn.l;v.r=dn.r;return v;}}public bool Hs(int n){Nd t=root;if(cnt==0){return false;}if(t.n==n){return true;}bool bo=false;while(true){if(t.n>n){if(t.l==du){break;}else if(t.l.n!=n){t=t.l;}else{bo=true;break;}}else{if(t.r==du){break;}else if(t.r.n!=n){t=t.r;}else{bo=true;break;}}}return bo;}public Nd Ra(int n){return cnt>=n?Fr(root,n):null;}private Nd Fr(Nd t,int n){if(t.l.c>n-1){return Fr(t.l,n);}if(t.l.c<n-1){return Fr(t.r,n-t.l.c-1);}return t;}public Nd Lb(int n){return cnt!=0?Flb(root,n):null;}private Nd Flb(Nd t,int n){if(t.n<n){if(t.r==du){return null;}return Flb(t.r,n);}if(t.n>n){if(t.l==du){return t;}Nd u=Flb(t.l,n);return u==null?t:u;}return t;}public Nd Ub(int n){return cnt!=0?Fub(root,n):null;}private Nd Fub(Nd t,int n){if(t.n>n){if(t.l==du){return null;}return Fub(t.l,n);}if(t.n<n){if(t.r==du){return t;}Nd u=Fub(t.r,n);return u==null?t:u;}return t;}public int Rg(int a,int b){return cnt!=0?Frg(root,a,b,false,false):0;}private int Frg(Nd t,int a,int b,bool l,bool r){if(t.h==0){return 0;}if(l&&r){return t.c;}if(t.n<a){return Frg(t.r,a,b,t.n>=a,r);}if(t.n>b){return Frg(t.l,a,b,l,t.n<=b);}return Frg(t.l,a,b,l,t.n<=b)+Frg(t.r,a,b,t.n>=a,r)+1;}public void En(Action<Nd> f){if(cnt>0){Fen(root,f);}}private void Fen(Nd t,Action<Nd> f){f(t);if(t.l!=du){Fen(t.l,f);}if(t.r!=du){Fen(t.r,f);}}}public class Sc{public int I{get{return int.Parse(Console.ReadLine());}}public long L{get{return long.Parse(Console.ReadLine());}}public double D{get{return double.Parse(Console.ReadLine());}}public string S{get{return Console.ReadLine();}}public int[] Ia{get{return Array.ConvertAll(Console.ReadLine().Split(),int.Parse);}}public long[] La{get{return Array.ConvertAll(Console.ReadLine().Split(),long.Parse);}}public double[] Da{get{return Array.ConvertAll(Console.ReadLine().Split(),double.Parse);}}public string[] Sa{get{return Console.ReadLine().Split();}}public object[] Oa{get{return Console.ReadLine().Split();}}public int[] Ia2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),int.Parse);}}public int[] Ia3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),int.Parse);}public int[] Ia3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),int.Parse);}public long[] La2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),long.Parse);}}public long[] La3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),long.Parse);}public long[] La3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),long.Parse);}public double[] Da2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),double.Parse);}}public double[] Da3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),double.Parse);}public double[] Da3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),double.Parse);}public T[] Arr<T>(int n,Func<T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f();}return a;}public T[] Arr<T>(int n,Func<int,T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(i);}return a;}public T[] Arr<T>(int n,Func<string[],T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(Console.ReadLine().Split());}return a;}public T[] Arr<T>(int n,Func<int,string[],T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(i,Console.ReadLine().Split());}return a;}}