题解:CF1682D Circular Spanning Tree
首先,一棵树的度数和为
为了使连出来的是树,我们规定每个点只能向编号比它大的点连
但是这样
代码
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define i128 __int128
#define ALL(x) x.begin(),x.end()
#define popcount(x) __builtin_popcountll(x)
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
using namespace std;
const int INF=1e18;
const int N=200005;
const int MOD=1e9+7,MOD2=998244353;
int n,a[N];
int x;
int id(int u){
return ((u+x-1)%n?(u+x-1)%n:n);
}
void solve_(){
cin>>n;
int s=0;
x=0;
for(int i=1;i<=n;i++){
char c;
cin>>c;
a[i]=c-'0';
s+=a[i];
if(a[i]==1)x=i;
}
if(s%2||s==0){
cout<<"NO\n";
return;
}
//debug(x,id(1));
cout<<"YES\n";
cout<<id(n-1)<<" "<<id(n)<<"\n";
a[id(n-1)]=!a[id(n-1)];
for(int i=n-2;i>=1;i--){
if(a[id(i+1)]){
cout<<id(i)<<" "<<id(i+1)<<"\n";
}else{
cout<<id(i)<<" "<<id(n)<<"\n";
}
a[id(i)]=!a[id(i)];
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int testcase,multitest=1;
if(multitest)cin>>testcase;
else testcase=1;
while(testcase--){
solve_();
}
return 0;
}