Codeforcesラウンド#626(ディビジョン2、情報モスクワ開きオリンピックに基づきます)

Codeforcesラウンド#626(ディビジョン2、情報モスクワ開きオリンピックに基づきます)

ゲームのリンク

A.さえサブセット和問題

偶数又は奇数両者の最初の出現を検索します

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define MEM(X,Y) memset(X,Y,sizeof(X));
#define OPEN freopen("abc.in","r",stdin);
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
using namespace std;
 
int main(void)
{
	//OPEN;
	int ji[2],ou;
	int T,n,a;
	int cnt = 0;
	bool flag;
	scanf("%d", &T);
	while (T--)
	{
		flag = 0;
		cnt = 0;
		scanf("%d", &n);
		ou = -1;
		for (int i = 1; i <= n; ++i)
		{
			scanf("%d", &a);
			if (!flag)
			{
				if (a & 01)
					ji[cnt++] = i;
				else
					ou = i;
				if (cnt == 2 || ou != -1)
					flag = 1;
			}
		}
		if (flag)
		{
			if (ou != -1)
				printf("1\n%d", ou);
			else
				printf("2\n%d %d", ji[0], ji[1]);
		}
		else
			printf("-1");
		if (T)
			printf("\n");
	}
 
	return 0;
}

B.カウント副矩形

異なる長さの数は、連続するサブアレイとBのシーケンスを検索するとき、1〜N、Kの1〜Mの製品、対応するC [i]は、D [J]との積との間の出力

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define MEM(X,Y) memset(X,Y,sizeof(X));
#define OPEN freopen("abc.in","r",stdin);
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
using namespace std;
 
bool a[40010], b[40010];
int c[40010], d[40010];
int cnt;
int result;
 
int main(void)
{
 
	int n, m, k, t;
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 0; i < n; ++i)
	{
		scanf("%d", &t);
		a[i] = t;
	}
	for (int i = 0; i < m; ++i)
	{
		scanf("%d", &t);
		b[i] = t;
	}
	cnt = 0;
	for (int i = 0; i < n; ++i)
		if (a[i])
		{
			++cnt;
			for (int j = 1; j <= cnt; ++j)
				++c[j];
		}
		else
			cnt = 0;
	cnt = 0;
	for (int i = 0; i < m; ++i)
		if (b[i])
		{
			++cnt;
			for (int j = 1; j <= cnt; ++j)
				++d[j];
		}
		else
			cnt = 0;
	long long result = 0;
	for (int i = 1; i <= min(k, n); ++i)
	{
		if (k % i == 0 && k / i <= m)
			result += (long long)c[i] * d[k / i];
	}
	printf("%lld", result);
 
	return 0;
}

C.珍しい大会

ストップの数を等しくするために探して左括弧、右括弧の既存の番号は、ブラケットの位置から開始すると右括弧の長さマイナス現在の位置に適切な場所マイナスからの最後の時間の長さを見つけるために背中をつけてきました左ブラケットの最終的な値の数と右ブラケットが等しくない場合は、左右のブラケット、及びゼロの数に括弧を記録する位置の同数、-1の出力、およびそうでなければ出力レコード

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define MEM(X,Y) memset(X,Y,sizeof(X));
#define OPEN freopen("abc.in","r",stdin);
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
 
std::stack<char> s;
 
int left, right;
char orin[1000005];
 
int main(void)
{
 
	int n;
	int o = 0, c = 0;
	int last = -1;
	long long  result = 0;
	scanf("%d", &n);
	scanf("%s", orin);
	for (int i = 0; i < n; ++i)
	{
		if (orin[i] == '(')
			++left;
		else
			++right;
		if (left == right)
		{
			int j = 0;
			for (; i - j > last; ++j)
			{
				if (orin[i - j] == ')')
					s.push(')');
				if (s.empty() && orin[i - j] == '(')
					break;
				if (!s.empty() && orin[i - j] == '(')
					s.pop();
			}
			result += (long long)i - j - last;
			last = i;
			right = left = 0;
		}
	}
	if (left != right)
		printf("-1");
	else
		printf("%lld", result);
 
	return 0;
}

DEFはひどいです!

リリース8元の記事 ウォンの賞賛0 ビュー190

おすすめ

転載: blog.csdn.net/qq_45961715/article/details/104720126