如题,我的做法是:建一个 vector 存每个点相连的边,然后对于操作 1,直接将输进来的两个点丢进互相的 vector,对于操作 2,暴力扫这两个点对应的 vector,如果出现重复的就为答案,否则为 0。
这种做法理论上的时间复杂度是 O(n2),但却通过了,甚至时限绰绰有余。想问各位大佬是我的时间复杂度算假了还是单纯本题数据过水。
再者,不论是何种情况,这种写法都可以通过本题说明这次的 G 题过水,建议评橙。
AC 代码:
#include<bits/stdc++.h>
#define ll long long
#define MOD 998244353
#define endl '\n'
using namespace std;
ll n,m,tot,vist[100005],lst;
vector<ll>eg[100005];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
while(m--){
ll op,x,y;
cin>>op>>x>>y;
op=1+(((op*(1+lst))%MOD)%2);
x=1+(((x*(1+lst))%MOD)%n);
y=1+(((y*(1+lst))%MOD)%n);
if(op==1){
eg[x].push_back(y);
eg[y].push_back(x);
}
else{
tot++;ll out=0;
for(ll it:eg[x])vist[it]=tot;
for(ll it:eg[y]){
if(vist[it]==tot){
cout<<it<<endl;
lst=it;out=1;
break;
}
}
if(out==0){
cout<<0<<endl;
lst=0;
}
}
}
return 0;
}