提出 #68998525


ソースコード 拡げる

#include<iostream>
#include<vector>
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int N=1e5+10;
const int K=17+5;
const int M=N*K*8;
int n,m,q,cur,f[N],s[N],tu[N],tv[N],tx[N],ty[N],tz[N],res[N],tp[N];
int t,qi[M],pre[M],suf[M],bg[N][K],ed[N][K],px[N],py[N];
int finds(int x) {return f[x]==x?x:f[x]=finds(f[x]);}
bool check(int x,int y,int z,int k)
{
	int g=(1<<k),nx=(x/g+1)*g,ny=(y/g+1)*g;
	return (y==-1?nx:nx+ny)<z;
}
void ins(int ti,int k,int i)
{
	qi[++t]=i; int pl=bg[ti][k],pr=suf[pl];
	suf[pl]=t,pre[pr]=t,suf[t]=pr,pre[t]=pl;
}
void del(int p) {suf[pre[p]]=suf[p],pre[suf[p]]=pre[p];}
struct nod{int k,i,f;};
void cle(int ti,int lim)
{
	vector <nod> ta;
	for(int k=0;(1<<k)<=lim;k++)
	{
		int u=suf[bg[ti][k]];
		while(u!=ed[ti][k])
		{
			int i=qi[u],fx=finds(tx[i]),fy=finds(ty[i]);
			if(px[i]) del(px[i]),px[i]=0;
			if(py[i]) del(py[i]),py[i]=0;
			if(fx==fy)
			{
				if(s[fx]>=tz[i]) res[i]=cur;
				else
				{
					while(tp[i]&&!check(s[fx],-1,tz[i],tp[i])) tp[i]--;
					if(fx==ti) ta.pb({tp[i],i,0});
					else ins(fx,tp[i],i),px[i]=t;
				}
			}
			else
			{
				if(s[fx]+s[fy]>=tz[i]) res[i]=cur;
				else
				{
					while(tp[i]&&!check(s[fx],s[fy],tz[i],tp[i])) tp[i]--;
					if(fx==ti) ta.pb({tp[i],i,0});
					else ins(fx,tp[i],i),px[i]=t;
					if(fy==ti) ta.pb({tp[i],i,1});
					else ins(fy,tp[i],i),py[i]=t;
				}
			}
			u=suf[u];
		}
		suf[bg[ti][k]]=ed[ti][k],pre[ed[ti][k]]=bg[ti][k];
	}
	for(nod te:ta)
	{
		ins(ti,te.k,te.i);
		if(te.f) py[te.i]=t;
		else px[te.i]=t;
	}
}
int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		s[i]=1,f[i]=i;
		for(int k=0;k<17;k++)
		{
			bg[i][k]=++t,ed[i][k]=++t;
			pre[ed[i][k]]=bg[i][k],suf[bg[i][k]]=ed[i][k];
		}
	}
	for(int i=1;i<=m;i++) cin>>tu[i]>>tv[i];
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		cin>>tx[i]>>ty[i]>>tz[i],tp[i]=0;
		while(check(1,1,tz[i],tp[i])) tp[i]++;
		if(tp[i]) tp[i]--;
		ins(tx[i],tp[i],i),px[i]=t,ins(ty[i],tp[i],i),py[i]=t;
	}
	for(int i=1;i<=m;i++)
	{
		int x=finds(tu[i]),y=finds(tv[i]); cur=i;
		if(x==y) continue;
		if(s[x]>s[y]) swap(x,y);
		int sx=s[x],sy=s[y]; s[x]=s[y]=sx+sy,f[x]=y;
		cle(x,s[x]^sx),cle(y,s[y]^sy);
		for(int i=0;i<17;i++) if(suf[bg[x][i]]!=ed[x][i])
		{
			int ly=bg[y][i],ry=suf[ly],lx=suf[bg[x][i]],rx=pre[ed[x][i]];
			pre[lx]=ly,suf[ly]=lx,pre[ry]=rx,suf[rx]=ry;
		}
	}
	for(int i=1;i<=q;i++) cout<<res[i]<<'\n';
	return 0;
}

提出情報

提出日時
問題 D - Stamp Rally
ユーザ KSCD__
言語 C++ 20 (gcc 12.2)
得点 1000
コード長 2575 Byte
結果 AC
実行時間 188 ms
メモリ 91308 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1000 / 1000
結果
AC × 1
AC × 33
セット名 テストケース
Sample 0_00.txt
All 0_00.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt, 1_30.txt, 1_31.txt
ケース名 結果 実行時間 メモリ
0_00.txt AC 1 ms 3504 KiB
1_00.txt AC 85 ms 65732 KiB
1_01.txt AC 176 ms 76880 KiB
1_02.txt AC 120 ms 91308 KiB
1_03.txt AC 168 ms 71492 KiB
1_04.txt AC 130 ms 90996 KiB
1_05.txt AC 171 ms 72764 KiB
1_06.txt AC 127 ms 88064 KiB
1_07.txt AC 166 ms 72444 KiB
1_08.txt AC 137 ms 80508 KiB
1_09.txt AC 166 ms 69892 KiB
1_10.txt AC 141 ms 72472 KiB
1_11.txt AC 164 ms 65240 KiB
1_12.txt AC 138 ms 65132 KiB
1_13.txt AC 149 ms 61132 KiB
1_14.txt AC 126 ms 56228 KiB
1_15.txt AC 110 ms 55736 KiB
1_16.txt AC 140 ms 62104 KiB
1_17.txt AC 170 ms 68276 KiB
1_18.txt AC 162 ms 67676 KiB
1_19.txt AC 136 ms 62984 KiB
1_20.txt AC 162 ms 64856 KiB
1_21.txt AC 162 ms 65780 KiB
1_22.txt AC 163 ms 67644 KiB
1_23.txt AC 166 ms 68028 KiB
1_24.txt AC 176 ms 66580 KiB
1_25.txt AC 176 ms 67280 KiB
1_26.txt AC 148 ms 64472 KiB
1_27.txt AC 162 ms 67424 KiB
1_28.txt AC 167 ms 66100 KiB
1_29.txt AC 168 ms 66492 KiB
1_30.txt AC 188 ms 67728 KiB
1_31.txt AC 153 ms 64700 KiB