2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest E:Black or White
这道题可以比较容易看出是线性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的更多相关文章
- 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest
2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest A Secret of Chocolate Poles 思路:暴力枚举黑巧克力的个数和厚黑巧克力的个 ...
- 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 ...
- 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 ...
- 2018-2019, ICPC, Asia Yokohama Regional Contest 2018 K
传送门:https://codeforces.com/gym/102082/attachments 题解: 代码: /** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ...
- 2018 ICPC Asia Jakarta Regional Contest
题目传送门 题号 A B C D E F G H I J K L 状态 Ο . . Ο . . Ø Ø Ø Ø . Ο Ο:当场 Ø:已补 . : 待补 A. Edit Distance Thin ...
- Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机
题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...
- 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的长 ...
- Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律
题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...
- Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流
题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...
随机推荐
- Win7装VS2015报错"安装包丢失或损坏"的解决办法
在Win7上安装VS2015的过程中,可能会出现下图错误: 这种情况,多半是应为Win7里面缺少了两个证书: Microsoft Root Certificate Authority 2010 Mic ...
- 网络通信_socket
socket又称套接字 使用server实现循环通信 代码如下 import socket server = socket.socket() server.bind(()) server.listen ...
- 愚蠢的sql语法错误(sum (xxx))
sum和()之间打了一个空格,导致一致报sql语法错误,看了半天不知道怎么回事orz
- webpack 模块热替换的理解和使用
模块热替换(webpack文档上也叫 Hot Module Replacement 或 HMR)是 webpack 提供的最有用的功能之一.它允许在运行时更新各种模块,而无需进行完全刷新. 这句话其实 ...
- OpenCV常用基本处理函数(1)读写
图像的基本操作 cv.imread() 读取图片 cv.imshow() 显示图片 cv2.imwrite() 保存图像 使用摄像头捕获实时图像 OpenCV 为这中应用提供了 ...
- 【Bootstrapt】offset、push、pull
实现方式的区别: col-md-offset-*,是利用margin-left实现的,col-md-push-*/col-md-pull-*是利用相对定位实现的. 效果的区别: col-md-offs ...
- 工厂方法配置bean
1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...
- 搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
本文内容参考网络,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutor ...
- echarts 柱状图 X(Y)轴数据过多时,滑动以及内置缩放的问题
前言:在开发中碰到的情况(菜鸟出门). 在使用echarts 图表的时候发现要展示的数据过多,但是系统留的展示框太小,造成数据都挤压在一块(不好看而且新感觉很不专业). ...
- appium自动化测试- 元素操作
本文转自:https://www.cnblogs.com/sinder2018/articles/9699801.html 一.滑动屏幕 1.appium - 滑动屏幕 滑动接口: swipe(起始X ...