CodeForces 1200D White Lines
- Time limit
1500 ms
Memory limit
262144 kB
解题思路
1200D - White Lines
Let's consider a single row that contains at least one black cell. If the first appearance of a black
cell is at the l"
role="presentation" style="position: relative;">
l
l
-th column and the last appearance of a
black cell is at the r"
role="presentation" style="position: relative;">
r
r
-th column, we can determine whether it
becomes a white line when a certain cell (i,j)"
role="presentation" style="position: relative;">
(i,j)
(
i
,
j
)
is clicked in O(1)"
role="presentation" style="position: relative;">
O(1)
O
(
1
)
, after some preprocessing. It becomes
a white line if and only if a cell (i,j)"
role="presentation" style="position: relative;">
(i,j)
(
i
,
j
)
is clicked where the row is at [i,i+k−1]"
role="presentation" style="position: relative;">
[i,i+k−1]
[
i
,
i
+
k
−
1
]
and j≤l≤r≤j+k−1"
role="presentation" style="position: relative;">
j≤l≤r≤j+k−1
j
≤
l
≤
r
≤
j
+
k
−
1
. We just need to
compute l"
role="presentation" style="position: relative;">
l
l
and r"
role="presentation" style="position: relative;">
r
r
in advance.
Now let's consider all n"
role="presentation" style="position: relative;">
n
n
rows (not columns). First, count all
rows that are already white lines before clicking. Then we count the number of white rows when the
cell (1,1)"
role="presentation" style="position: relative;">
(1,1)
(
1
,
1
)
is clicked, by applying the above
method to all rows from 1"
role="presentation" style="position: relative;">
1
1
to k"
role="presentation" style="position: relative;">
k
k
. Ignore the already-white rows that we
counted before. So far we obtained the number of white rows when the cell (1,1)"
role="presentation" style="position: relative;">
(1,1)
(
1
,
1
)
is clicked. From now, we slide the window. Add the k+1"
role="presentation" style="position: relative;">
k+1
k
+
1
-st row and remove the 1"
role="presentation" style="position: relative;">
1
1
-st row by applying the same method to
them, and we obtain the number of white rows when the cell (2,1)"
role="presentation" style="position: relative;">
(2,1)
(
2
,
1
)
is clicked. We can repeat this until
we calculate all n−k+1"
role="presentation" style="position: relative;">
n−k+1
n
−
k
+
1
cases for clicking the cells at the
1"
role="presentation" style="position: relative;">
1
1
-st column. Then we repeat the whole
process for all n−k+1"
role="presentation" style="position: relative;">
n−k+1
n
−
k
+
1
columns.
The same process can be done for counting white columns, too. Now we know the number of white rows
and white columns when each cell is clicked, so we can find the maximum value among their sums.
Time complexity: O(n2)"
role="presentation" style="position: relative;">
O(n2)
O
(
n
2
)
可以说是十分暴力了,cf上打的标签有brute force。一个优化就是把橡皮覆盖的区域一格一格地移动,这样就可以\(O(1)\)更新边界了,(突然想到滑动窗口,虽然和这题关系不大)。还有个标签是尺取法,好像也没毛病,滑动区域,更新边界,这确实可以算简化的尺取或者双指针吧……
另外,由于滑动区域的时候,左右滑只能快速更新空白列数,不能快速更新空白行数,上下滑同理,所以行和列分开处理,各自来一遍
感想
本来这题没有必要写博客的,但太兴奋了,真的。写完代码,改好CE以后,样例一遍过,半信半疑交上去,居然就AC了!
回想暑假集训这一个月,蠢得跟啥使得,集训题的做题记录,同样是一片绿,别人的就一个AC时间,我的除了AC时间,下方全都有“-1”“-2”“-3”(失败的提交次数)……每个小错都要浪费我至少两个小时……好几次花半天时间,找到了诸如continue写成return、数组下标或者变量写错之类的错,太憋屈了…………
源代码
#include<cstdio>
#include<algorithm>
int n,k;
const int MAXN=2e3+4;
int u[MAXN],d[MAXN],l[MAXN],r[MAXN];
int ansrow[MAXN][MAXN],anscol[MAXN][MAXN],wrow,wcol;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
char s[2010];
scanf("%s",s+1);
for(int j=1;j<=n;j++)
{
if(s[j]=='B')
{
r[i]=j;
if(!l[i]) l[i]=j;
d[j]=i;
if(!u[j]) u[j]=i;
}
}
}
for(int i=1;i<=n;i++)
{
if(u[i]==0) wcol++;
if(l[i]==0) wrow++;
}
//先是列
for(int i=1;i+k-1<=n;i++)//对于每一行
{
for(int ii=1;ii<=k;ii++)//统计每行开头区域的答案
if(d[ii]&&d[ii]<=i+k-1&&u[ii]>=i) anscol[i][1]++;
for(int j=2;j+k-1<=n;j++)//将统计区域向右滑动
{
anscol[i][j]=anscol[i][j-1];
if(d[j-1]&&d[j-1]<=i+k-1&&u[j-1]>=i) anscol[i][j]--;
if(d[j+k-1]&&d[j+k-1]<=i+k-1&&u[j+k-1]>=i) anscol[i][j]++;
}
}
//然后行也来一遍
for(int i=1;i+k-1<=n;i++)
{
for(int ii=1;ii<=k;ii++)//统计每列开头区域的答案
if(r[ii]&&r[ii]<=i+k-1&&l[ii]>=i) ansrow[1][i]++;
for(int j=2;j+k-1<=n;j++)//将统计区域向下滑动
{
ansrow[j][i]=ansrow[j-1][i];
if(r[j-1]&&r[j-1]<=i+k-1&&l[j-1]>=i) ansrow[j][i]--;
if(r[j+k-1]&&r[j+k-1]<=i+k-1&&l[j+k-1]>=i) ansrow[j][i]++;
}
}
int ans=-1;
for(int i=1;i+k-1<=n;i++)
{
for(int j=1;j+k-1<=n;j++)
ans=std::max(ans,anscol[i][j]+ansrow[i][j]);
}
printf("%d\n",ans+wcol+wrow);
return 0;
}
CodeForces 1200D White Lines的更多相关文章
- White Lines
D. White Lines 主要思路就是利用差分 对于行:如果在某一个点上,向右下角涂掉 k*k 的矩形能够使得新出现一行 "B" 那么就在这个点上 +1(这里的加 +1 需要利 ...
- D. White Lines
D. White Lines 给定一个$n\times n$的$WB$矩阵,给定一个$k*k$的能把$B$变成$W$的橡皮擦,求橡皮擦作用一次后,全为$W$的行.列总数最大值 前缀和差分 #inclu ...
- CF1200D White Lines | 前缀和
传送门 Examples input 1 4 2 BWWW WBBW WBBW WWWB output 1 4 input 2 3 1 BWB WWB BWB output 2 2 input 3 5 ...
- codeforces 872E. Points, Lines and Ready-made Titles
http://codeforces.com/contest/872/problem/E E. Points, Lines and Ready-made Titles time limit per te ...
- Codeforces 870E Points, Lines and Ready-made Titles:并查集【两个属性二选一】
题目链接:http://codeforces.com/problemset/problem/870/E 题意: 给出平面坐标系上的n个点. 对于每个点,你可以画一条经过这个点的横线或竖线或什么都不画. ...
- codeforce D. White Lines
二维前缀和 给你一个n*n的矩阵,里面有两种字符,‘W’和‘B’,代表black 和white .其实这个矩阵就是一个方形画板,你有一个k*k的橡皮只能用一次,使k*k的矩阵里的B变成W,问完全空白的 ...
- Codeforces 870E Points, Lines and Ready-made Titles 计数
题目链接 题意 给定二维坐标上的\(n\)个点,过每个点可以 画一条水平线 或 画一条竖直线 或 什么都不画,并且若干条重合的直线被看做同一条.问共可能得到多少幅不同的画面? 题解 官方题解 仆の瞎扯 ...
- CF1200D 【White Lines】
退役快一年了之后又打了场紧张刺激的$CF$(斜眼笑) 然后发现$D$题和题解里的大众做法不太一样 (思路清奇) 题意不再赘述,我们可以看到这个题~~好做~~在只有一次擦除机会,尝试以此为突破口解决问题 ...
- cf1200 D White Lines(二维差分)
题目大意 有一个大小为n的矩阵,每个1*1的单位为黑或白,我们可以用一个(只有一个)大小为k*k的白色矩阵覆盖,问:最多的时候有几条白线(横的全为白 或竖的全为白 即为白线). 思路 要想把一条线(以 ...
随机推荐
- python 并发编程 基于gevent模块实现并发的套接字通信
之前线程池是通过操作系统切换线程,现在是程序自己控制,比操作系统切换效率要高 服务端 from gevent import monkey;monkey.patch_all() import geven ...
- sql盲注-笔记
盲注是因为数据库查询的结果不会直接显示在页面.只能通过构造查询语句查看反馈的结果真&假状态来判断信息. 实际注入手法和回显注入区别不大 下面只记录相关思路 select length ...
- ucloud自动创建instance
用terrform for ucloud: https://www.terraform.io/docs/providers/ucloud/index.html https://docs.ucloud. ...
- seata项目结构
1. 概述 在拉取 Seata 项目后,我们会发现拆分了好多 Maven 项目.
- Spring(六)--Spring配置文件之间的关系
Spring配置文件之间的关系 1.需要的实体类 2.需要的xml文件 3.测试类 未完待续!!!
- Hive Error : Java heap space 解决方案
Java heap space问题一般解决方案: 设置 set io.sort.mb=10; 排序所使用的内存数量,默认值是100M,和mapred.child.java.opts相对应,opts默认 ...
- HDU 6175 算术
题目大意 求 $\sum_{i = 1}^{n} \sum_{j = 1}^{m} \mu(\lcm(i, j))$ . $ 1 \le n, m \le 10^6 $ . 分析 不妨设 $ n \l ...
- Nob常用命令
说明:此文件为常用的命令笔记 规则: .使用"[组名]"分组,如[linux] .使用"<标题一>"标示知识点,可用"<<二级 ...
- RabbitMQ入门教程(十七):消息队列的应用场景和常见的消息队列之间的比较
原文:RabbitMQ入门教程(十七):消息队列的应用场景和常见的消息队列之间的比较 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 这是网上的一篇教程写的很好,不知原作 ...
- 如何将本地的一个新项目上传到GitHub上新建的仓库中去
1:我们需要先创建一个本地的版本库(其实也就是一个文件夹).直接右击新建文件夹,或者右击打开Git bash命令行窗口通过命令mkdir来创建(mkdir 文件名). 进入这个文件夹的根目录,选中目录 ...