Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
35148 LYLAKIOI 【S】T3 C++ 解答错误 80 105 MS 39540 KB 3332 2024-11-28 13:35:56

Tests(30/31):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=3e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,L,R,f[maxn],tg[maxn],q,vis[maxn],cnt; vector<int>E[maxn],cyc; int dep[maxn],bel[maxn],dfn[maxn],siz[maxn],bel2[maxn],ct; int SIZ[maxn],all[maxn]; void dfs(int u,int f1,int f2){ bel[u]=f1,bel2[u]=f2,dfn[u]=++ct,siz[u]=1;all[f1]++; for(int x:E[u])if(!tg[x])dep[x]=dep[u]+1,dfs(x,f1,f2); } void fc(int u){ ++cnt; while(!vis[u])vis[u]=1,u=f[u]; vector<int>cyc;int x=u;do cyc.p_b(u),u=f[u];while(u!=x); for(int x:cyc)tg[x]=1; up(i,0,int(cyc.size())-1)dfs(cyc[i],cnt,i); SIZ[cnt]=cyc.size(); } int dist(int x,int y,int L){ if(x<=y)return y-x; return y+L-x; } int F[maxn]; void bfs(){ queue<int>q;up(i,1,n)F[i]=-1;q.push(0); set<int>s;up(i,1,n)s.insert(i); while(!q.empty()){ int u=q.front();q.pop(); int l=u+L,r=u+R; auto it=s.lower_bound(l);vector<int>A; while(it!=s.end()&&(*it)<=r)A.p_b(*(it++)); for(int x:A)s.erase(x),q.push(x),F[x]=F[u]+1; } } int res[maxn],ans[maxn]; vector<pi>Q[maxn]; vector<int>s[maxn]; void slv(){ n=read(),L=read(),R=read(); up(i,1,n)f[i]=read(),E[f[i]].p_b(i); up(i,1,n)if(!bel[i])fc(i);bfs(); q=read(); up(i,1,q){ int x=read(),y=read(); if(x==y){res[i]=0;continue;} if(bel[x]!=bel[y]){res[i]=-1;continue;} if(tg[x]&&(!tg[y])){res[i]=-1;continue;} if((!tg[x])&&(!tg[y])&&(!(dfn[x]>=dfn[y]&&dfn[x]<=dfn[y]+siz[y]-1))){res[i]=-1;continue;} if((!tg[x])&&(!tg[y])){ int d=dep[x]-dep[y];res[i]=F[d];continue; } Q[bel[x]].p_b(m_p(dep[x]+dist(bel2[x],bel2[y],SIZ[bel[x]]),i)); } up(i,1,ct){ int sz=all[i],c=SIZ[i]; up(j,0,sz)s[j].clear(); up(j,1,sz){ ll l=j*1ll*L,r=j*1ll*R; ll rem=max(0ll,(l-sz+c-1)/c); l-=rem*c,r-=rem*c; //cout<<"? "<<l<<" "<<r<<endl; if(r-l>=sz){s[0].p_b(j);continue;} if(r<=sz){s[l].p_b(j),s[r+1].p_b(-j);continue;} s[l].p_b(j);ll v=r+1-c; //cout<<"? "<<l<<" "<<sz+1-c<<" "<<v<<endl; if(v<=sz)s[v].p_b(-j); s[sz-c].p_b(j); } multiset<int>A; up(i,0,sz){ for(int x:s[i])(x<0?A.erase(A.lower_bound(-x)):A.insert(x)); ans[i]=((A.size())?(*A.begin()):-1); //printf("ans[%d]=%d\n",i,ans[i]); } down(i,sz-c,0){ if(ans[i+c]==-1)continue; if(ans[i]==-1)ans[i]=ans[i+c]; else ans[i]=min(ans[i],ans[i+c]); } for(auto it:Q[i])res[it.p2]=ans[it.p1]; } up(i,1,q)printf("%d\n",res[i]); } int main(){ //freopen("oneness.in","r",stdin); //freopen("oneness.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }


测评信息: