Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32964 | A21μΘ_wjy | 【S】T2 | C++ | 通过 | 100 | 368 MS | 94508 KB | 1658 | 2024-10-02 16:24:59 |
#include<bits/stdc++.h> #define int short #define i32 signed using namespace std; const int maxn=2e3+7; const int LB=12; int rd(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while('0'<=ch&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } i32 rd1(){ i32 x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while('0'<=ch&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } int n,m,tp; i32 q; vector<int> E[maxn]; int U[maxn<<2]; int V[maxn<<2]; int F[maxn][maxn][LB]; bool vis[maxn]; inline void DFS(int u){ // cout<<u<<endl; vis[u]=1; for(auto v:E[u])if(!vis[v])DFS(v); }//求出所有可以到达 t 的点 inline void Set(int ST[maxn][LB],int t){ for(int i=1;i<=n+1;i++)ST[i][0]=n+1; for(int i=1;i<=m;i++)if(vis[U[i]]&&vis[V[i]])ST[U[i]][0]=min(ST[U[i]][0],V[i]); ST[t][0]=n+1; for(int j=1;j<LB;j++)for(int i=1;i<=n+1;i++)ST[i][j]=ST[ST[i][j-1]][j-1]; }//预处理 i32 main(){ n=rd();m=rd();q=rd1();tp=rd(); for(int i=1;i<=m;i++)U[i]=rd(),V[i]=rd(),E[V[i]].push_back(U[i]); for(int t=1;t<=n;t++){ for(int i=1;i<=n;i++)vis[i]=0; DFS(t);Set(F[t],t); } i32 lst=1; while(q--){ int s,t,k; s=rd(),t=rd(),k=rd(); if(tp)s=(s^lst)%n+1,t=(t^lst)%n+1,k=(k^lst)%n+1; if(F[t][s][0]>n){ lst=1,printf("%d\n",-lst); continue; } if(F[t][F[t][s][LB-1]][LB-1]<=n){ lst=1,printf("%d\n",-lst); continue; } k--; for(int i=LB-1;i>=0;i--)if(k&(1<<i))s=F[t][s][i]; if(s>n){ lst=1,printf("%d\n",-lst); continue; } lst=s; printf("%d\n",lst); } }