結果

問題 No.2704 L to R Graph
ユーザー lgswdnlgswdn
提出日時 2024-10-04 23:12:37
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,856 bytes
コンパイル時間 2,737 ms
コンパイル使用メモリ 214,916 KB
実行使用メモリ 27,972 KB
最終ジャッジ日時 2024-10-04 23:12:47
合計ジャッジ時間 7,646 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 4 ms
15,204 KB
testcase_01 WA -
testcase_02 AC 9 ms
16,108 KB
testcase_03 AC 5 ms
15,552 KB
testcase_04 AC 4 ms
15,840 KB
testcase_05 AC 6 ms
15,120 KB
testcase_06 AC 5 ms
16,964 KB
testcase_07 AC 5 ms
15,888 KB
testcase_08 RE -
testcase_09 AC 46 ms
21,080 KB
testcase_10 AC 43 ms
20,928 KB
testcase_11 RE -
testcase_12 AC 42 ms
25,664 KB
testcase_13 RE -
testcase_14 AC 41 ms
25,284 KB
testcase_15 AC 43 ms
25,588 KB
testcase_16 AC 41 ms
25,284 KB
testcase_17 AC 41 ms
25,284 KB
testcase_18 AC 43 ms
25,416 KB
testcase_19 RE -
testcase_20 AC 41 ms
25,288 KB
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 RE -
testcase_25 AC 52 ms
27,716 KB
testcase_26 RE -
testcase_27 AC 37 ms
20,936 KB
testcase_28 AC 37 ms
21,952 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

//Shirasu Azusa 2024.09
#include<bits/stdc++.h>
#define fi first
#define se second
#define eb emplace_back
#define mp make_pair
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
template<typename T,typename U>
T ceil(T x, U y) {return (x>0?(x+y-1)/y:x/y);}
template<typename T,typename U>
T floor(T x, U y) {return (x>0?x/y:(x-y+1)/y);}
template<class T,class S>
bool chmax(T &a,const S b) {return (a<b?a=b,1:0);}
template<class T,class S>
bool chmin(T &a,const S b) {return (a>b?a=b,1:0);}

#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
int read() {
	int x=0,w=1; char c=getchar(); 
	while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
	while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();} 
	return x*w;    
}

const int N=1e5+5;
int n,L,R,f[N],Q,id[N],sc[N],cnt,deg[N],vst[N],tr[N],d[N],dfn[N],sz[N],tick,ss[N],q[N],ans[N],dep[N],wsd[N];
vi gg[N],qr[N],te[N],e[N];

int find(int i) {return id[i]==i?i:id[i]=find(id[i]);}
void dfs(int u,int st) {
	dfn[u]=++tick, sz[u]=1, ss[u]=st;
	for(int v:e[u]) if(tr[v]) dep[v]=dep[u]+1, dfs(v,st), sz[u]+=sz[v];
}

signed main() {
	n=read(), L=read(), R=read();
	rep(i,1,n) f[i]=read(), deg[f[i]]++;
	rep(i,1,n) id[i]=i, e[f[i]].eb(i);
	rep(i,1,n) id[find(i)]=find(f[i]);
	rep(i,1,n) if(find(i)==i) sc[i]=++cnt;
	rep(i,1,n) sc[i]=sc[find(i)], gg[sc[i]].eb(i);
	queue<int> qq;
	rep(i,1,n) if(!deg[i]) qq.push(i);
	while(!qq.empty()) {
		int u=qq.front(); qq.pop(); tr[u]=1;
		--deg[f[u]]; if(!deg[f[u]]) qq.push(f[u]);
	}
	rep(i,1,cnt) {
		int x=0,tmp=0; for(int y:gg[i]) if(!tr[y]) x=y;
		for(;!vst[x];) {
			vst[x]=1; dfs(x,tmp++); x=f[x]; wsd[i]++;
		}
	}
	Q=read();
	rep(i,1,Q) {
		int s=read(), t=read(); int x=sc[find(s)];
		if(s==t) ans[i]=0;
		else if(find(s)!=find(t)) ans[i]=-1;
		else {
			if(tr[t]==1) {
				if(dfn[t]<=dfn[s]&&dfn[s]<dfn[t]+sz[t]) {
					int dis=dep[s]-dep[t];
					int mk=(dis+R-1)/R;
					if(mk*L>dis) ans[i]=-1;
					else ans[i]=mk;
				} else ans[i]=-1;
			} else {
				int d1=dep[s];
				int d2=ss[t]-ss[s];
				if(d2<0) d2+=wsd[x];
				q[i]=d1+d2, qr[x].eb(i);
			}
		}
	}
	rep(ts,1,cnt) {
		int w=wsd[ts], m=gg[ts].size();
		static int g[N];
		rep(i,0,m) g[i]=2*N;
		rep(i,0,m+1) te[i].clear();
		rep(k,1,m) {
			int l=L*k, r=R*k;
			if(r-l>=m) {te[0].eb(k); break;}
			else if(r<=m) {
				te[l].eb(k), te[r+1].eb(-k);
			} else {
				te[l].eb(k); int x=r-m;
				te[m-w+1].eb(k), te[r-w+1].eb(-k);
			}
		}
		multiset<int> mst;
		rep(i,0,m) {
			for(int x:te[i]) {
				if(x>0) mst.insert(x);
				else mst.erase(mst.find(-x));
			}
			if(!mst.empty()) g[i]=*mst.begin();
		}
		per(i,m-w,0) chmin(g[i],g[i+w]);
		for(int i:qr[ts]) ans[i]=g[q[i]];
	}
	rep(i,1,Q) printf("%d\n",ans[i]);
	return 0;
}
0