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はひどいです!!!