时间复杂度算假or数据过水?
查看原帖
时间复杂度算假or数据过水?
938212
OMG_NOIP楼主2024/4/21 15:58

如题,我的做法是:建一个 vector 存每个点相连的边,然后对于操作 11,直接将输进来的两个点丢进互相的 vector,对于操作 22,暴力扫这两个点对应的 vector,如果出现重复的就为答案,否则为 00。

这种做法理论上的时间复杂度是 O(n2)O(n^2),但却通过了,甚至时限绰绰有余。想问各位大佬是我的时间复杂度算假了还是单纯本题数据过水。

再者,不论是何种情况,这种写法都可以通过本题说明这次的 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;
}
2024/4/21 15:58
加载中...