AC代码
加了一段这个// 两个点都已经已知,就不需要继续找了
然后找的次数少了,就AC了。
1 2 if (vis[a] && vis[b]) return ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> using namespace std;typedef long long ll;const ll N=static_cast <ll>(1e3 )+10 ;ll n,T; bitset<N> vis; bool ans[N][N];void solve (ll a,ll b) { if (ans[a][b]) return ; if (vis[a] && vis[b]) return ; cout<<"? " <<a<<" " <<b<<endl; ll ret; cin>>ret; if (ret<0 ) exit (0 ); if (ret==a) { vis[a]=true ,vis[b]=true ; ans[a][b]=true ; }else { solve (a,ret); solve (ret,b); } } int main () { ios::sync_with_stdio (false ); cin.tie (0 );cout.tie (0 ); cin>>T; while (T--) { cin>>n; vis.reset (); for (int i=1 ;i<=n;++i) for (int j=1 ;j<=n;++j) ans[i][j]=false ; for (int i=2 ;i<=n;++i) { if (vis[i]) continue ; solve (1 ,i); } cout<<"! " ; for (int i=1 ;i<=n;++i) { for (int j=1 ;j<=n;++j) { if (ans[i][j]) cout<<i<<" " <<j<<" " ; } } cout<<endl; } }
心路历程(WA,TLE,MLE……)
WA on test 5
Probably, the solution is executed with error ‘out of bounds’ on the line 24
我也不太理解为什么会越界数组,除非他给我输入-1
好像还真是。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> using namespace std;typedef long long ll;const ll N=static_cast <ll>(1e3 )+10 ;ll n,T; bitset<N> vis; bool ans[N][N];void solve (ll a,ll b) { if (ans[a][b]) return ; cout<<"? " <<a<<" " <<b<<endl; ll ret; cin>>ret; if (ret==a) { vis[a]=true ,vis[b]=true ; ans[a][b]=true ; }else { solve (a,ret); solve (ret,b); } } int main () { ios::sync_with_stdio (false ); cin.tie (0 );cout.tie (0 ); cin>>T; while (T--) { cin>>n; vis.reset (); for (int i=1 ;i<=n;++i) for (int j=1 ;j<=n;++j) ans[i][j]=false ; for (int i=2 ;i<=n;++i) { if (vis[i]) continue ; solve (1 ,i); } cout<<"! " ; for (int i=1 ;i<=n;++i) { for (int j=1 ;j<=n;++j) { if (ans[i][j]) cout<<i<<" " <<j<<" " ; } } cout<<endl; } }