这场ARC…我打的不是特别好…只A掉了前两题,第三题在最后10分钟想出了一点眉目,结果来不及打了QAQ…
最终排名:rank361,rating+=86.
目前rating:1394(Fighting!!!)
C - Make a Rectangle
题意:给你 n 根木棍,让你选其中的
4 根组成一个矩形,问矩形能组成的最大面积为多少。
思路&&题解:其实因为木棍不能由两根或多根组成一条边,只需要找到长度相等的木棍,如果该木棍有两根,那就在另一个数组加入一次这种长度,如果有四根,就加两次。最后对那个数组从大到小排序一遍就行了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100050;
map<int,int> s;
int x,n;
ll num[maxn];
int tot=0;
bool cmp(ll a,ll b) {
return a>b;
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&x);
s[x]++;
}
for(map<int,int>::iterator it=s.begin();it!=s.end();it++) {
if(it->second>=4) {
num[++tot]=it->first;
num[++tot]=it->first;
continue;
}
else if(it->second>=2) {
num[++tot]=it->first;
}
}
sort(num+1,num+tot+1,cmp);
if(tot<2) {
puts("0");
return 0;
}
else {
printf("%lld\n",(num[1]*num[2]));
return 0;
}
return 0;
}
D - Coloring Dominoes
题意:给你两串长为 n,(n≤52) ,表示有 n 个多米诺骨牌,两个相同字母的
1×2 或 2×1 的方格表示一个多米诺骨牌。现在想给他们染色,一共有红,绿,蓝三种颜色可以染,规定相邻的两个多米诺骨牌不能染相同的颜色,求一共有多少种染色的方法。
思路&&题解:设一个竖着放的多米诺骨牌为 X ,两个上下摆放并且横着放的多米诺骨牌为Y ,我们可以发现只有 XX,XY,YX,YY 四种情况。
而 XX 这种情况,后面的 X 一共有两种染色方法;XY 这种情况,后面的 Y 有两种染色方法;YX 这种情况,后面的 X 只有一种染色方法;YY 这种情况,后面的 Y 有三种染色方法。然后直接这样分类讨论下去就行了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=60;
const ll mod=1e9+7;
int n;
char s[3][maxn];
ll sum=1;
int main() {
scanf("%d",&n);
for(int i=1;i<=2;i++) {
scanf("%s",s[i]+1);
}
int pos=1,ne=0;
while(pos<=n) {
if(pos==1) {
if(s[1][pos]==s[2][pos]) {
sum*=3;
pos++;
ne=1;
continue;
}
else {
sum*=6;
pos+=2;
ne=2;
}
continue;
}
if(s[1][pos]==s[2][pos]) {
sum*=(3-ne);
ne=1;
sum%=mod;
pos++;
continue;
}
else {
if(s[1][pos-2]==s[1][pos-1]) {
sum*=3;
sum%=mod;
pos+=2;
ne=2;
continue;
}
sum*=(3-ne);
sum%=mod;
ne=2;
pos+=2;
continue;
}
}
printf("%lld\n",sum);
}
E - Do not Be a Subsequence
题意:给你一串字符串,求最短的且字典序最小的字符串不是原串的子序列。
思路&&题解:先从后往前预处理出每个位置往后有多少个完整的a∼z ,用 res[i] 表示。然后对于 a∼z ,求出每个字符在原串中从前往后第一次出现的位置。再预处理出每个位置在该位置之后的 a∼z 每个字符下次出现的位置,用 nxt[pos][i] 表示。之后就开始大力贪心。枚举第一个字符的位置,然后枚举下一个字符,找到 res[nxt[pos][i]] 最小的字符,再继续往下找直到找到字符串结尾就行了…
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=200050;
char s[maxn];
int pos[maxn][26],len,fst[26],res[maxn],tot=0;
bool book[26];
int ans[26][maxn];
int maxx=maxn+1,in;
int main() {
memset(book,0,sizeof book);
scanf("%s",s+1);
len=strlen(s+1);
for(int i=len;i>=1;i--) {
fst[s[i]-'a']=i;
for(int k=0;i<=25;k++) {
pos[i][k]=(k==s[i]-'a')?i:pos[i+1][k];
res[i]+=res[i+1];
}
if(!book[s[i]-'a']) {
tot++;
if(tot==26) {
tot=0;
memset(book,0,sizeof book);
res[i-1]++;
}
}
}
for(int i=0;i<=25;i++) {
int num=1,po=fst[i],ind;
ans[i][1]=i;
while(1) {
int ma=999;
bool f=1;
for(int j=0;j<=25;j++) {
if(res[pos[po][j]]<ma) {
ma=res[pos[po][j]];
ind=j;
f=0;
}
}
num++;
ans[i][num]=ind;
po=pos[po][ind];
if(f)
break;
}
if(num<maxx) {
maxx=num;
in=i;
}
}
for(int i=1;i<=maxx;i++)
printf("%c",ans[in][i]+'a');
return 0;
}
F - Flip and Rectangles
题意(转换后的):给你一个 n×m 的 01 矩阵,每次可以对一列或者一行上的每个数字取反,可以进行多次取反,问你能获得的最大全为 1 <script type="math/tex" id="MathJax-Element-1740">1</script>的矩阵面积为多少。
题解:这题暂时我还不会…先放一放吧qwq