Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33007 yuanjiabao 【S】T2 C++ 通过 100 413 MS 339792 KB 1929 2024-10-02 19:01:22

Tests(20/20):


#include<iostream> #include<cstring> #include<vector> #include<bitset> #include<ctime> #define timeMS (clock()*1000/CLOCKS_PER_SEC) using namespace std; inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } const int N=2010,M=5010,LG=12; int n,m,q,t; int head[N<<1],to[M<<1],nex[M<<1],edge; inline void insert(int u,int v){ edge++; to[edge]=v; nex[edge]=head[u]; head[u]=edge; } bool acc[N][N]; bool vis[N]; int dfs(int nd,int frm){ vis[nd]=true; acc[frm][nd]=true; for(int i=head[nd];i;i=nex[i])if(!vis[to[i]])dfs(to[i],frm); } void init(){ cin>>n>>m>>q>>t; for(int i=1;i<=m;i++){ int u=read(),v=read(); insert(u,v); } for(int i=1;i<=n;i++){ dfs(i,i); memset(vis,0,sizeof(vis)); } } int fa[N][N][LG];//目标为 i 下 j 的下一步 inline int kfa(int i,int nd,int k){ for(int j=0;k;k>>=1,j++)if(k&1)nd=fa[i][nd][j]; return nd; } int main(){ // freopen("path.in","r",stdin); // freopen("path.out","w",stdout); init(); for(int i=1;i<=n;i++){//枚举目标 for(int j=1;j<=n;j++)if(acc[j][i]&&i!=j){ int mn=n+1; for(int e=head[j];e;e=nex[e])if(acc[to[e]][i])mn=min(mn,to[e]); if(mn>n)continue; fa[i][j][0]=mn; } for(int l=1;l<LG;l++){ for(int j=1;j<=n;j++)fa[i][j][l]=fa[i][fa[i][j][l-1]][l-1]; } } int lans=1; while(q--){ int u,v,k; if(t)u=(read()^lans*t)%n+1,v=(read()^lans*t)%n+1,k=(read()^lans*t)%n+1; else u=read(),v=read(),k=read(); if(kfa(v,u,n)!=0||kfa(v,u,k-1)==0||!acc[u][v]){printf("-1\n");lans=1;continue;} lans=kfa(v,u,k-1); printf("%d\n",lans); } // cerr<<timeMS; return 0; }


测评信息: