Codeforces Round #658 (Div. 2) [补题记录]
Posted 晁棠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #658 (Div. 2) [补题记录]相关的知识,希望对你有一定的参考价值。
Codeforces Round #658 (Div. 2)
Problem A
找到最少的数,使得这个数在a数组中出现过,同时也在b数组中出现过。最少的个数绝对为1,数据范围小,直接bool数组判重。
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
int n, T, m;
bool f[1005];
int a[1005];
int b[1005];
void ready()
IOS;
cin >> T;
void work()
cin >> n >> m;
ffor(i, 1, 1000) f[i] = false;
ffor(i, 1, n)
cin >> a[i];
f[a[i]] = true;
ffor(i, 1, m)
cin >> b[i];
ffor(i, 1, m)
if (f[b[i]])
cout << "YES\\n";
cout << 1 << ' ' << b[i] << '\\n';
return;
cout << "NO\\n";
signed main()
ready();
while(T--)
work();
return 0;
Problem B
当把前缀1全部过掉之后,后续的结果如何完全可以被下一个选手掌控。也就是说,去掉前缀1之后,下一个行动的人能够掌控全局。但是需要特判全部数值只有1的情况。
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, T;
int a[N];
void ready()
IOS;
cin >> T;
void work()
bool f = true;
cin >> n;
ffor(i, 1, n)
cin >> a[i];
int i = 0, cnt = 0;
while (a[i+1] == 1 && i+1<=n)
i++;
cnt++;
if (i & 1) f = false;
else f = true;
if (i == n)
if (n & 1) f = true;
else f = false;
if (f) cout << "First\\n";
else cout << "Second\\n";
signed main()
ready();
while (T--)
work();
return 0;
Problem C1
3n次的限制,构造。从后往前看,如果有不一样的,先翻转一次第一位到该位置,然后翻转第1位,之后再翻转回来,这样子就能够对于一串数字,后面不懂,前缀不变,只改变了当前位。
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
int n, T;
char a[1005], b[1005];
int len;
int q[50005];
void ready()
IOS;
cin >> T;
void work()
cin >> n;
cin >> a + 1 >> b + 1;
int qi = 0;
rrep(i, n, 1)
if (a[i] != b[i])
q[++qi] = i;
if (i > 1)
q[++qi] = 1;
q[++qi] = i;
cout << qi << ' ';
ffor(i, 1, qi) cout << q[i] << ' ';
cout << '\\n';
signed main()
ready();
while (T--)
work();
return 0;
Problem C2
2n的次数限制,采用双指针。双指针指a的一头一尾,b从后往前判,因为要保证b的后缀不变。先判断a的头指针和b当前位置是否相同,如果不同直接翻转一次即可。如果相同,先翻转一次1,再整体翻转。随后就能保证最后一位与b相同。翻转后的a的第一个是原先的a的尾,再进行多一次判断,随后再翻转,翻转后的第一个是最开始的a的第二个,也就是头指针移动一位。自此利用双指针进行判断。
注意当前是要判断不一样还是判断一样,因为翻转一次之后,1变0,0变1。
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long
using namespace std;
int n, T;
char a[100005], b[100005];
int len;
int q[5000005];
void ready()
IOS;
cin >> T;
bool check_(bool flag, char a, char b)
if (flag)
if (a != b) return false;
return true;
else
if (a != b) return true;
return false;
void work()
cin >> n;
cin >> a + 1 >> b + 1;
int qi = 0;
int l = 1, r = n, cnt = 1;
bool flag = true;
rrep(i, n, 1)
if (cnt & 1)
/*------l指针--------*/
if (check_(flag, a[l], b[i]))
q[++qi] = 1;
q[++qi] = i;
else
q[++qi] = i;
l++;
else
/*------r指针--------*/
if (check_(flag, a[r], b[i]))
q[++qi] = 1;
q[++qi] = i;
else
q[++qi] = i;
r--;
flag = flag ? false : true;
cnt++;
cout << qi << ' ';
ffor(i, 1, qi) cout << q[i] << ' ';
cout << '\\n';
signed main()
ready();
while (T--)
work();
return 0;
Problem D
首先,对于4 3 2 5 1 11 9 12 8 6 10 7
,可以发现4 3 2
必须放在一起,因为如果不在一起,则不可能是递减顺序取数,只能够递增顺序取数。所以这个样例能够分成4 3 2
、5 1
、11 9
、12 8 6 10 7
。我们记录长度为3、2、2、5。随后转变成一个背包问题,这些长度是否有一种取法能够使长度达到n,这个时候另一组也是为n。
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) Codeforces Round #658 (Div. 2) [补题记录]
Codeforces Round #658 (Div. 2)ABC2
Codeforces Round #658 (Div. 2) D. Unmerge(dp)
Codeforces Round #658 (Div. 2) - D. Unmerge(dp)