这道题可以比较容易看出是线性DP。设dp[i]代表把前i个格子刷成目标状态的最小步数。

写出状态转移方程 dp[i]=min( dp[j]+calc(j+1,i) ) (i-j<=k) calc(j+1,i)代表把区间 [j+1,i] 的块刷成目标状态的最小代价。

那么问题在于怎么算calc(j+1,i)。这里直接给出结论:calc=(s[i]-s[j])/2+1,意思是最小代价是先把区间[j+1,i]刷成段数比较多的那种颜色,然后再一段一段把段数较小的刷好。代价就是1+(s[i]-s[j])/2。

把方程拆开  2*f[i]=2*f[j]+s[i]-s[j]+2     f[i]=(s[i]+(2*f[j]-s[j])+2) / 2

观察式子发现只有  2*f[j]-s[j] 跟j相关,并且j的取值上下界都在变化。容易想到用单调队列优化。

这里还要主要一个小细节:例如 BBBWWW  那么s的值就是 111222  。此时s[5]-s[2]=1,事实上[3,4,5]这一段应该是两段组成,s[5]-s[2]应该等于2 。

所以要加入  if (s[i]==s[i+1]) s[i]--;   这一句代码。意思是i点还不是该段结尾点,i+1及后面还会有这一段的残余,然后令s[i]-1使得后面的s[p]减去s[i]的时候会算上这一段残余段(比较难表达,但就是这个意思qwq)。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+;
int n,k,f[N],s[N],q[N];
char A[N],B[N]; int calc(int j) { return *f[j]-s[j]; } int main()
{
cin>>n>>k;
scanf("%s",A+); scanf("%s",B+);
for (int i=;i<=n;i++) if (B[i]!=B[i-]) s[i]=;
for (int i=;i<=n;i++) s[i]+=s[i-]; int h=,t=; q[]=;
for (int i=;i<=n;i++) {
while (h<=t && i-q[h]>k) h++;
if (h<=t) f[i]=(s[i]+calc(q[h])+)/;
if (A[i]==B[i]) f[i]=f[i-];
if (s[i]==s[i+]) s[i]--; //这一句很重要
while (h<=t && calc(i)<=calc(q[t])) t--;
q[++t]=i;
}
cout<<f[n]<<endl;
return ;
}

2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest E:Black or White的更多相关文章

  1. 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest

    2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest A Secret of Chocolate Poles 思路:暴力枚举黑巧克力的个数和厚黑巧克力的个 ...

  2. ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków

    ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...

  3. 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)

    2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...

  4. 2018-2019, ICPC, Asia Yokohama Regional Contest 2018 K

    传送门:https://codeforces.com/gym/102082/attachments 题解: 代码: /** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ...

  5. 2018 ICPC Asia Jakarta Regional Contest

    题目传送门 题号 A B C D E F G H I J K L 状态 Ο . . Ο . . Ø Ø Ø Ø . Ο Ο:当场 Ø:已补 .  :  待补 A. Edit Distance Thin ...

  6. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  7. Gym - 101981M The 2018 ICPC Asia Nanjing Regional Contest M.Mediocre String Problem Manacher+扩增KMP

    题面 题意:给你2个串(长度1e6),在第一个串里找“s1s2s3”,第二个串里找“s4”,拼接后,是一个回文串,求方案数 题解:知道s1和s4回文,s2和s3回文,所以我们枚举s1的右端点,s1的长 ...

  8. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...

  9. Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流

    题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...

随机推荐

  1. Node.js定时邮件的那些事儿

    近开发一个项目,需要在Node.js程序里实现定期给管理员发邮件的功能. 笔者平时只会在Web界面收发邮件.对邮件的原理完全不懂(可能大学教过,然而全忘了),直到要解决这个问题.请教了几个业务的同事, ...

  2. 【串线篇】SpringMvc框架乱码

    提交的数据可能有乱码: * 请求乱码: *      GET请求:改server.xml:在8080端口处URIEncoding="UTF-8" *      POST请求: * ...

  3. 关于Linux_系统资源监控_dmesg_free_uptime_uname

    (系统资源查看命令-dmesg[查看系统内核资源信息])->判断服务器的硬件状态 Comment:dmesg | grep CPU,指定查看cpu资源信息 (系统资源查看命令-free[查看内存 ...

  4. 百度语音 python

    python实现语音识别 我们用到是百度语音识别,因为不掏钱哈哈!首先去百度官网去创建你的 APPID AK SK 这个网上很多大家没创建的自己看下 目前本SDK的功能同REST API,需要联网调用 ...

  5. 根据mysql数据库 定义solr Schema.xml中配置业务域

    <!--product--> <field name="product_name" type="text_ik" indexed=" ...

  6. linux部署jdk-tomcat

    http://blog.csdn.net/u012187452/article/details/72595040 //参考jdk下载 一.安装JDK1 下载安装包http://blog.csdn.ne ...

  7. Centos MySQL 5.7安装、升级教程

    MySQL 5.7安装.升级笔记分享: 卸载当前的 MySQL 查看当前 MySQL 版本: ? 1 2 [root@coderknock ~]# mysql -V mysql Ver 14.14 D ...

  8. pic16f877a的PWM实验学习

    遇到的问题,编译时找不到TRISC.一开始以为头文件中没有定义,发现定义了. 所以是自己创建工程的时候,设备类型选错了. #include <pic.h> __CONFIG(0xFF32) ...

  9. 【MySQL】mysql查询强制大小写及替换字段

    强制大小写 select * from test where name like BINARY '%Adc%' mysql替换字段 update test set name= REPLACE (nam ...

  10. Network基础(五):配置静态路由、配置浮动路由、配置多路由的静态路由、配置默认路由

    一.配置静态路由 目标: 配置路由接口IP地址并通过静态路由的配置实现全网的互通. 方案: 按如下网络拓扑配置接口IP地址并通过静态路由的配置实现全网的互通如下图所示: 步骤: 步骤一:配置静态路由 ...