C - Make a Rectangle

从大到小贪心即可。

# include <bits/stdc++.h>
using namespace std;
map<int,int>m;
int main()
{
int n, a;
scanf("%d",&n);
while(n--) scanf("%d",&a), m[a]++;
int r=0, c=0;
for(auto i:m)
if(i.second>3) r=c=i.first;
else if(i.second>1) c=r,r=i.first;
printf("%lld\n",(long long)r*c);
}

D - Coloring Dominoes

就是个乘法原理。

# include <bits/stdc++.h>
using namespace std;
#define P 1000000007
int n;
char s1[100], s2[100];
int main(){
scanf("%d%s%s",&n,s1,s2);
long long ans=s1[0]==s2[0]?3:6;
for(int i=1; i<n; ++i){
if(s1[i-1]==s2[i-1]) ans=ans*2%P;
if(s1[i]!=s2[i]&&s1[i-1]!=s2[i-1]&&s1[i]!=s1[i-1]&&s2[i]!=s2[i-1]) ans=ans*3%P;
}
printf("%lld",ans);
}

E - Don't Be a Subsequence

首先考虑如何求答案串的最小长度。

显然是可以dp的。

首先考虑长度为1的答案,显然标记一下哪些字母没出现过即可。

否则令\(dp[i]\)表示\(suffix(i)\)的以\(s[i]\)为开头的答案串的最小长度,容易得到\(dp[i]=min(dp[j]+1)\),其中\(j>i\)并且\(s[j]\)是\(suffix(i)\)里所有同样字符的最左端。

对于每个\(i\),这样的j最多只有26个,可以通过一次\(O(26\times len)\)预处理出来。

如果求出了答案串的最小长度,如何确定答案串的最小字典序呢?

考虑dp转移的过程,每次用字典序靠前的字符来进行转移就行了。

记录一下路径,倒序输出即可。

时间复杂度\(O(26\times len)\)。

# include <bits/stdc++.h>
using namespace std;
const int N=200005;
int vis[26];
char s[N];
struct Node{int len, id, c;}dp[N], ans; int main ()
{
scanf("%s",s+1);
int len=strlen(s+1);
for (int i=len; i>=1; --i) {
dp[i].len=dp[vis[0]].len+1; dp[i].id=vis[0]; dp[i].c=0;
for (int j=1; j<=25; ++j) if (dp[i].len>dp[vis[j]].len+1) dp[i].len=dp[vis[j]].len+1, dp[i].id=vis[j], dp[i].c=j;
vis[s[i]-'a']=i;
}
for (int i=0; i<=25; ++i) if (!vis[i]) {printf("%c\n",i+'a'); return 0;}
ans.len=dp[vis[0]].len; ans.id=vis[0]; ans.c=0;
for (int i=1; i<=25; ++i) if (ans.len>dp[vis[i]].len) ans.len=dp[vis[i]].len, ans.id=vis[i], ans.c=i;
while (ans.id) putchar(ans.c+'a'), ans.c=dp[ans.id].c, ans.id=dp[ans.id].id;
putchar(ans.c+'a');
putchar('\n');
return 0;
}

F - Flip and Rectangles

我们首先考虑一个\(2\times 2\)的方格,如果包含奇数个黑格子的话,我们把它称为\(Bad-Part\)。

显然,对于每一个最后可能出现的黑矩形,其中必然不包含\(Bad-Part\)。

因为对于\(Bad-Part\),无论怎么操作都无法全部变黑。

假设\(S\)不包含任意\(Bad-Part\),那么我们可以进行一些操作使得S全部变黑。

如何证明?

考虑S的最上面一行和最左边一行,由于我们必然要把他们变成黑色,所以操作是一定的,而这些操作也一定可以将

整个S变黑。

现在的问题是,找到一个面积最大的\(S\),使得S不包含任何\(Bad-Part\)。

我们可以把每个\(Bad-Part\)缩到\(2\times 2\)方格中心的那个位置,我们把这样的点称为\(Bad-Point\)。

那么问题就变成了经典的最大全0子矩阵了。

而这个问题有经典的悬线法可以\(O(nm)\)解决。

# include <bits/stdc++.h>
using namespace std;
const int N=2005;
char s[N][N];
int n, m, a[N], b[N]; int main()
{
scanf("%d%d",&n,&m);
int ans=max(n,m);
for(int i=0;i<n;i++) scanf("%s",s[i]);
for(int i=0;i<n;i++) {
for(int j=0;j<m-1;j++) {
if(i&&!(s[i-1][j+1]^s[i][j]^s[i-1][j]^s[i][j+1])) a[j]++;
else a[j]=1;
}
int t=0;
for(int j=0;j<=m-1;j++) {
while(t&&a[b[t-1]]>=a[j]) {
int x=b[--t];
if(t==0) ans=max(ans,(j+1)*a[x]);
else ans=max(ans,(j-b[t-1])*a[x]);
}
b[t++]=j;
}
}
printf("%d\n",ans);
return 0;
}

AtCoder Regular Contest 081的更多相关文章

  1. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  2. AtCoder Regular Contest 081 E - Don't Be a Subsequence(字符串DP)

    引用自:onion_cyc 字符串DP一直不是强项...以后没思路的题就想DP和网络流23333333 f[i]表示从i开始的后缀非子序列的最短长度  pos[i][j]表示从i开始的j字符最早出现位 ...

  3. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  4. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  5. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  6. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  7. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  8. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  9. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

随机推荐

  1. Docker系列之CentOS7安装Docker(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 一.瞎扯淡(只讲有用的) 感兴趣的同学可以上网搜索一下docker具体的介绍.我这边主要介绍偏实战的内容,不喜勿喷,有问题也请指出 ...

  2. 2018年美国大学生数学建模竞赛(MCM/ICM) B题解题思路

    老套路,把我们在解决B题时候采用的思路分享给大家,希望大家能学到点东西~~~ B题思路整理:Part1:先整理出说某种语言多的十个国家给找出来,或者说是把十种语言对应的国家找出来 然后再对各个国家的人 ...

  3. linux下查看端口是否被占用以及查看所有端口

    1.查看服务器端口是否被占用 >lsof  -i:8081 2.查看服务器所有端口 >netstat -ntlp 3.查看服务器是否开放某端口 tcp端口:>netstat -ntp ...

  4. appium自动化---activity获取

    方法一:appt查询activity获取 aapt dump badging <路径/包名> | find "launchable-activity" 方法二: 1.打 ...

  5. JMeter做http接口压力测试

    测前准备 用JMeter做接口的压测非常方便,在压测之前我们需要考虑这几个方面: 场景设定 场景分单场景和混合场景.针对一个接口做压力测试就是单场景,针对一个流程做压力测试的时候就是混合场景,需要多个 ...

  6. 打包应用和构建Docker镜像(docker在windows上)

    在构建Docker时编译应用 一般有两种方法在构建镜像时进行打包应用.第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译ap ...

  7. 2019CSUST集训队选拔赛题解(二)

    凛冬将至 Description 维斯特洛大陆的原住民是森林之子,他们长得如孩童一般,善于使用石器,威力值35,用树叶树枝作为衣物,在森林里繁衍生息,与万物和平相处.他们会使用古老的魔法(比如绿之视野 ...

  8. sqlmap 进阶 (一)

    0x1 命令 以此类推,可以具体自己研究有哪些参数,放在哪,有什么用,怎么用 参考:https://blog.csdn.net/bo_mask/article/details/76130848 0x2 ...

  9. Linux 做网关

    首先创建两张路由表,只需要添加到相应的文件中即可,Linux一共支持255个路由表,rt_tables文件中默认已经存在了三张路由表,分别是:   255  local   254  main   2 ...

  10. Python基础系列讲解——继承派生和组合的概念剖析

    Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系. 所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的 ...