A. Restaurant Tables
题意: 水题瞎搞搞
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8
#define pb push_back
#define mem(a) memset(a,0,sizeof a)
using namespace std ;
const long long mod = 1000000007 ;
void init() {
}
int main() {
int n, a, b;
while (scanf ("%d%d%d" , &n, &a, &b) != EOF) {
int n1 = a, n2 = b, n2a = 0 ;
int ans = 0 ;
int x;
for (int i = 1 ; i <= n; i++) {
scanf ("%d" , &x);
if (x == 1 ) {
if (n1 > 0 ) {
n1--;
}
else if (n2 > 0 ) {
n2--;
n2a++;
}
else if (n2a > 0 ) {
n2a--;
}
else {
ans++;
}
}
else {
if (n2 > 0 ) {
n2--;
}
else {
ans += 2 ;
}
}
}
printf ("%d\n" , ans);
}
return 0 ;
}
B. Black Square
题意: 等价于找一个包括所有B的最小正方形
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8
#define pb push_back
#define mem(a) memset(a,0,sizeof a)
using namespace std ;
const long long mod = 1000000007 ;
void init() {
}
char cmp[111 ][111 ];
int mp[111 ][111 ];
int sum[111 ][111 ];
int main() {
int n, m;
while (scanf ("%d%d" , &n, &m) != EOF) {
for (int i = 0 ; i < n; i++) {
scanf ("%s" , cmp[i]);
}
for (int i = 1 ; i <= n; i++) {
for (int j = 1 ; j <= m; j++) {
if (cmp[i - 1 ][j - 1 ] == 'W' ) mp[i][j] = 0 ;
else mp[i][j] = 1 ;
}
}
memset (sum, 0 , sizeof sum);
for (int i = 1 ; i <= n; i++) {
for (int j = 1 ; j <= m; j++) {
sum[i][j] = sum[i-1 ][j] + sum[i][j-1 ] - sum[i-1 ][j-1 ] + mp[i][j];
}
}
int nb = sum[n][m];
int ans = 0 ;
int fa = 0 ;
for (int len = 0 ; len < min(n, m); len++) {
for (int i = 1 ; i + len <= n; i++) {
for (int j = 1 ; j + len <= m; j++) {
int temp = sum[i + len][j + len] - sum[i - 1 ][j + len] - sum[i + len][j - 1 ] + sum[i - 1 ][j - 1 ];
if (temp == nb) {
ans = (len + 1 ) * (len + 1 ) - nb;
fa = 1 ;
break ;
}
}
if (fa == 1 ) break ;
}
if (fa == 1 ) break ;
}
if (fa == 0 ) {
printf ("-1\n" );
}
else {
printf ("%d\n" , ans);
}
}
return 0 ;
}
C. String Reconstruction
题意:给出n个字符串,每个字符串si 有至少k次出现在ans串中,给出k个起始位置。所有已知条件不会矛盾,如果ans串有不确定的位置,就用’a’代替。
思路:可以用并查集做,fa[i]表示从第i个位置开始,最早一个没有被赋值的位置。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8
#define pb push_back
#define mem(a) memset(a,0,sizeof a)
using namespace std ;
const long long mod = 1000000007 ;
int n, k;
int fa[2222222 ];
char s[2222222 ], s1[2222222 ];
int find_fa(int x){
return fa[x] == x ? x : fa[x] = find_fa(fa[x]);
}
int main(){
int maxx = 0 ;
for (int i = 0 ; i <= 2222222 ; i++) fa[i] = i;
scanf ("%d" , &n);
while (n--) {
scanf ("%s%d" , s1, &k);
int len = strlen (s1);
int x;
while (k--){
scanf ("%d" ,&x);
for (int i = find_fa(x); i < x + len; i = fa[i] = find_fa(i+1 )){
s[i] = s1[i - x];
if (i > maxx) maxx = i;
}
}
}
for (int i = 1 ; i <= maxx; i++) putchar (s[i] ? s[i] : 'a' ); puts ("" );
return 0 ;
}