QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#706152 | #9484. Colored Complete Graph | BalintR# | WA | 1ms | 4008kb | C++20 | 2.3kb | 2024-11-03 07:48:46 | 2024-11-03 07:48:47 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpii;
#define pb push_back
#define fs first
#define sn second
#define ms(a, x) memset(a, x, sizeof(a))
#define SZ(v) ((int) (v).size())
#define ALL(v) begin(v), end(v)
const int INF = 0x3f3f3f3f;
#define FR(i, n) for(int i = 0; i < (n); i++)
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define FORR(i, a, b) for(int i = (a); i >= (b); i--)
#define dbg(x){cerr << #x << ' ' << (x) << endl;}
#define dbgArr(arr, n){cerr << #arr; FR(_i, n) cerr << ' ' << (arr)[_i]; cerr << endl;}
template <class T, class U>
ostream& operator<<(ostream &os, pair<T, U> p){return os << "(" << p.fs << ", " << p.sn << ")";}
const int MN = 5e4 + 5;
int n;
int dsu[2][MN];
vi roots[2];
vpii edges[2];
int find(int s, int a){
return dsu[s][a] < 0 ? a : dsu[s][a] = find(s, dsu[s][a]);
}
void merge(int s, int a, int b){
a = find(s, a), b = find(s, b);
assert(a != b);
dsu[s][a] += dsu[s][b];
dsu[s][b] = a;
}
bool query(int a, int b){
cout << a+1 << ' ' << b+1 << endl;
char res; cin >> res;
assert(res != 'F');
return res == 'R';
}
int main(){
cin.sync_with_stdio(0); cin.tie(0);
cin >> n;
ms(dsu, -1);
roots[0].pb(0);
roots[1].pb(0);
FOR(n1, 1, n){
assert(SZ(roots[0]) == 1 || SZ(roots[1]) == 1);
bool s = 0;
if(SZ(roots[0]) == 1) s = 1;
assert(SZ(roots[!s]) == 1);
while(!roots[s].empty()){
int n2 = roots[s].back();
if(query(n1, n2) == s){
edges[s].pb({n1, n2});
merge(s, n1, n2);
roots[s].pop_back();
}
else {
edges[!s].pb({n1, n2});
merge(!s, n1, n2);
roots[!s].pop_back();
break;
}
}
roots[0].pb(n1);
roots[1].pb(n1);
}
bool s = 0;
if(SZ(roots[0]) != 1) s = 1;
assert(SZ(roots[s]) == 1);
assert(SZ(edges[s]) == n-1);
assert(dsu[s][roots[s][0]] == -n);
cout << "!\n";
for(auto [a, b] : edges[s]){
cout << b+1 << ' ' << a+1 << '\n';
}
cout << flush;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 4008kb
input:
3
output:
2 1
result:
wrong answer invalid question