链接

C.Make a Rectangle

给出一堆木棍的长度

从中选4根,询问在能围成矩形的情况下,矩形的最大面积

开个map统计一下就行

分正方形和矩形分别统计即可

复杂度$O(n \log n)$

#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} #define ri register int
#define ll long long ll ans; int n, mx;
map <int, int> num; int main() {
n = read();
for(ri i = ; i <= n; i ++) num[read()] ++;
for(map<int, int> :: iterator it = num.begin(); it != num.end(); it ++) {
int p1 = it -> first, p2 = it -> second;
if(p2 >= ) ans = max(ans, 1ll * p1 * p1);
if(p2 >= ) ans = max(ans, 1ll * p1 * mx), mx = p1;
}
printf("%lld\n", ans);
return ;
}

D.Coloring Dominoes

给出一个$2 * m$的网格,被$1 *2$的骨牌满覆盖

有3种颜色,给骨牌染色,要求相领的骨牌颜色不相同,询问方案数

分4种情况讨论即可

自己是($1 * 2$或者$2 *2$),前置状态是($1 * 2$或者$2 * 2$)

复杂度$O(n)$,$n = 52$...

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define ri register int
#define sid 105
#define mod 1000000007 int n;
char S[][sid]; int main() {
cin >> n >> S[] + >> S[] + ;
ri i = , ans;
if(S[][i] == S[][i]) i = , ans = ;
else i = , ans = ;
for(i = i + ; i <= n; i ++) {
int p1 = S[][i] == S[][i];
int p2 = S[][i - ] == S[][i - ];
if(!p1) i ++;
if(p1 && p2) ans = (1ll * ans * ) % mod;
if(!p1 && !p2) ans = (1ll * ans * ) % mod;
if(!p1 && p2) ans = (1ll * ans * ) % mod;
}
printf("%d\n", ans);
return ;
}

E.Don't Be a Subsequence

询问最短的,字典序最小的,不是串$S$的子序列的字符串

考虑序列自动机

那么,所有不能被$S$所识别的序列一定是在识别了一段前置之后多了一个字母

考虑虚拟一个节点$n + 1$,能转移到它说明不是串$S$的子序列

之后就是一个拓扑图$dp$和字典序的事了

复杂度$O(26 * n)$

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; #define ri register int
#define sid 200050 char s[sid];
int nxt[sid][], f[sid]; int main() { scanf("%s", s + );
int n = strlen(s + ); for(ri i = ; i < ; i ++) nxt[n][i] = n + ;
for(ri i = n - ; i >= ; i --) {
for(ri j = ; j < ; j ++) nxt[i][j] = nxt[i + ][j];
nxt[i][s[i + ] - 'a'] = i + ;
} for(ri i = n; i >= ; i --) {
f[i] = 1e9;
for(ri j = ; j < ; j ++)
f[i] = min(f[i], + f[nxt[i][j]]);
} int o = ;
while(o != n + ) {
for(ri j = ; j < ; j ++)
if(f[o] == f[nxt[o][j]] + ) {
o = nxt[o][j];
printf("%c", j + 'a'); break;
}
}
return ;
}

F. Flip and Rectangles

可以任意地翻转一些行或者一些列

询问最大子矩阵

鬼畜的性质:一个矩阵中,如果所有的$2 *2$子矩形都有偶数个黑点,那么它就能被翻转出来

证明网上一大堆

然后令$v[i][j]$表示以$(i, j)$为左上角存不存在$2 *2$偶数黑点矩阵

问题转化为求最大子矩阵

注意特判一行,一列

注意计算答案时,求出来的最大子矩阵的长和宽是原题中最大子矩阵长和宽 - 1的结果

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define ri register int
#define sid 2005 char s[sid];
int n, m, ans;
bool v[sid][sid], c[sid][sid];
short h[sid][sid], l[sid][sid], r[sid][sid];
short L[sid][sid], R[sid][sid]; int main() { scanf("%d%d", &n, &m);
for(ri i = ; i <= n; i ++) {
scanf("%s", s + );
for(ri j = ; j <= m; j ++)
c[i][j] = (s[j] == '#') ? : ;
} for(ri i = ; i < n; i ++)
for(ri j = ; j < m; j ++)
v[i][j] = c[i][j] ^ c[i + ][j] ^ c[i][j + ] ^ c[i + ][j + ] ^ ; for(ri i = ; i <= n; i ++) {
int lst = ;
for(ri j = ; j <= m; j ++)
if(v[i][j]) l[i][j] = lst;
else L[i][j] = , lst = j; lst = m + ;
for(ri j = m; j >= ; j --)
if(v[i][j]) r[i][j] = lst;
else R[i][j] = m + , lst = j;
} for(ri i = ; i <= m + ; i ++) R[][i] = m + ; ans = max(n, m);
for(ri i = ; i <= n; i ++)
for(ri j = ; j <= m; j ++)
if(v[i][j]) {
h[i][j] = h[i - ][j] + ;
L[i][j] = max((short)(l[i][j] + ), L[i - ][j]);
R[i][j] = min((short)(r[i][j] - ), R[i - ][j]);
ans = max(ans, (R[i][j] - L[i][j] + ) * (h[i][j] + ));
} printf("%d\n", ans);
return ;
}

AtCoder Regular Contest 81的更多相关文章

  1. AtCoder Regular Contest 061

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

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

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

  3. AtCoder Regular Contest 092

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

  4. AtCoder Regular Contest 093

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

  5. AtCoder Regular Contest 094

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

  6. AtCoder Regular Contest 095

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

  7. AtCoder Regular Contest 102

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

  8. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  9. AtCoder Regular Contest 097

    AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...

随机推荐

  1. 2016CCPC东北地区大学生程序设计竞赛 (2018年8月22日组队训练赛)

    题目链接:http://acm.hdu.edu.cn/search.php?field=problem&key=2016CCPC%B6%AB%B1%B1%B5%D8%C7%F8%B4%F3%D ...

  2. php查询mysql返回大量数据结果集导致内存溢出的解决方法

    web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...

  3. Perl6 必应抓取(1):测试版代码

    一个相当丑漏的代码, 以后有时间再优化了. 默认所有查找都是15页, 如果结果没有15页这么多估计会有重复.速度还是很快的. sub MAIN() { my $fp = open 'bin_resul ...

  4. webgote的例子(5)Sql注入(Blog)

    SQL Injection - Stored (Blog) (本章内容):留言板的注入 看到这个页面先看以下这个页面是做什么的.进行正常的写入发现我每写一句话,其内容都会写到下面的entry里面 在尝 ...

  5. Linux中fork()函数的底层实现【转】

    转自:http://blog.csdn.net/duoru_xiong/article/details/76358812 1. fork(),vfork(),clone()的区别 这三个系统调用的底层 ...

  6. 64_s2

    sipwitch-1.9.15-3.fc26.x86_64.rpm 13-Feb-2017 09:19 162822 sipwitch-cgi-1.9.15-3.fc26.x86_64.rpm 13- ...

  7. What I Learned as a Junior Developer Writing Tests for Legacy Code(转载)

    I go to the gym and lift weights because I like the feeling of getting stronger and better. Two mont ...

  8. opencv配置过程 (cmake,vs2013,qt 5.4)

    平台及软件: Windows 7 X86 Visual Studio 2013 OpenCV3.0.0 Cmake3.3 1.下载Windows下的安装文件OpenCV-3.0.0.exe,解压,选择 ...

  9. 转:google测试分享-分层测试

    原文: http://blog.sina.com.cn/s/blog_6cf812be0102vctg.html 上一次分享了google测试分享-SET和TE,有一些自动化测试的细节没有说清楚,那这 ...

  10. setitimer()

    setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个 ...