B. Flip the Bits
分析a串:从头开始遍历,每出现一段连续的01相等的子串,那么这一段子串就可以进行翻转操作,然后和b串对应的位置相比较,要么完全相反,要么完全相等。但是这每一段子串需要从头开始连着,不能间断。
最后可能会剩下一段,我们用一个while来剪掉最后相等的部分,因为没必要进行这部分的判断。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void work()
{
string a, b;int n;
cin >> n >> a >> b;
int sum0 = 0, sum1 = 0, ok = 1;
while(a[n-1] == b[n-1] && n > 0) --n;
int pre = 0;
for(int i = 0; i < n; ++i)
{
if(a[i] == '1') { ++sum1;if(b[i]=='0') ok = 0;
}
else {
++sum0;if(b[i] =='1') ok = 0;
}
if(sum1 == sum0)
{
int x1 = 1, x2 = 1;// x1维护全部相等 x2维护全部相反
for(int j = pre; j <= i; ++j)
{
if(a[j] != b[j]) x1 = 0;
if(a[j] == b[j]) x2 = 0;
}
// ok = 0 意味着这段子串需要全部相反
if(x2) ok = 1;// 全部相反就继续进行判断
if(!ok){
cout << "NO\n"; return;
}
pre = i + 1;
}
}
if(ok) cout << "YES\n";
else cout << "NO\n";
}
int main()
{
int T; cin >> T;
while(T--) work();
return 0;
}
/*
1
6
011011
010100
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 9;
int n;
char s[N];
char ans[N];
void work()
{
cin >> n;
cin >> s + 1;
bool flag = true;
int cnt = 0;
if(s[1] != '1' || s[n] != '1') flag = false;
for(int i = 2 ; i < n ; i ++)
if(s[i] == '0') cnt ++;
if(cnt & 1) flag = false;
if(!flag) cout << "NO\n";
else
{
cout << "YES\n";
int l = 1, r = n;
while(l < r)
{
while(s[l] != '1') l ++;
while(s[r] != '1') r --;
if(l >= r) break;
ans[l ++] = '(', ans[r --] = ')';
}
int cnt = 0;
for(int i = 1 ; i <= n ; i ++)
if(s[i] == '0')
{
cnt ++;
if(cnt & 1) ans[i] = '(';
else ans[i] = ')';
}
for(int i = 1 ; i <= n ; i ++) cout << ans[i];
cout << "\n";
cnt = 0;
for(int i = 1 ; i <= n ; i ++)
if(s[i] == '0')
{
cnt ++;
if(cnt & 1) ans[i] = ')';
else ans[i] = '(';
}
for(int i = 1 ; i <= n ; i ++) cout << ans[i];
cout << "\n";
}
}
int main()
{
int T; cin >> T;
while(T--)
work();
return 0;
}
D. 3-Coloring
先把奇数坐标和偶数坐标存起来,所以的奇数坐标不可能相邻,所以的偶数坐标也不可能相邻。
显然每次只能禁一个,只要没禁1,就用1构造,如果禁1就用2构造。
当奇数被用完,优先用2构造,如果2被禁就用3构造。
当偶数被用完,优先用1构造,如果1被禁就用3构造。
显然用3构造的时候它只能被用于一种类型的坐标上,也不会发生冲突
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void work()
{
vector<pair<int,int> > od, ev;
int n, x;
scanf("%d", &n);
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
{
if((i + j) & 1) od.push_back({i, j});
else ev.push_back({i, j});
}
int l = 0, r = 0;
for(int i = 0 ; i < n * n ; i ++)
{
cin >> x;
if(x != 1 && l < od.size())
{
cout << 1 << " " << od[l].first << " " << od[l].second << endl;
fflush(stdout);
l ++;
}
else if(x != 2 && r < ev.size())
{
cout << 2 << " " << ev[r].first << " " << ev[r].second << endl;
fflush(stdout);
r ++;
}
else
{
if(l < od.size())
{
cout << 3 << " " << od[l].first << " " << od[l].second << endl;
fflush(stdout);
l ++;
}
else
{
cout << 3 << " " << ev[r].first << " " << ev[r].second << endl;
fflush(stdout);
r ++;
}
}
}
}
int main()
{
work();
return 0;
}