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 25 111 912 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)

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)