YYHS-鏖战字符串
题目描述
输入
输出
样例输入
样例输出
提示
|
测试点编号
|
n
|
特殊约定
|
|
1
|
n≤10
|
所有的字母都是a
|
|
2
|
所有的字母都是a或b
|
|
|
3
|
|
|
|
4
|
||
|
5
|
n≤2000
|
所有的字母都是a
|
|
6
|
所有的字母都是a或b
|
|
|
7
|
l=1,r=n
|
|
|
8
|
|
|
|
9
|
||
|
10
|
||
|
11
|
n≤100000
|
l=1,r=n
|
|
12
|
||
|
13
|
||
|
14
|
||
|
15
|
l>r
|
|
|
16
|
||
|
17
|
|
|
|
18
|
||
|
19
|
||
|
20
|
题解
这道题刚开始只想到50分的方法
自己斜率优化不怎么会,过了好久才A
这道题如果没有第二种方法就是裸的斜率优化
所以我们先考虑第一种方法,通过计算,我们可以发现
若j>k且dp[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b>=dp[k]+a*(sum[i]-sum[k])*(sum[i]-sum[k])+b,就可以把k弹出
通过化简可得sum[i]*2*a*(sum[j]-sum[k])>=dp[j]-dp[k]+a*sum[j]*sum[j]-a*sum[k]*sum[k]
第一种方法做完后我们就考虑第二种方法
dp[i]=min(dp[j]+(sum[i]-sum[j])*c+d)=min(dp[j]-sum[j]*c+d+sum[i]*c)
而d+sum[i]*c是一个常数,所以我们之要维护一下dp[j]-sum[j]*c就可以了,这里我们可以用堆和单调队列
因为本人不怎么会单调队列,所以用了堆。
对于判断第二种的可行性,我们可以开一个n*26的数组,可以预处理出前i个字符中所有字符的出现次数
所以每次判断一段区间是否可行的时候只要常数次操作就可以了。
#include<bits/stdc++.h>
#define N 100005
#define ll long long
#define node pair<int,int>
using namespace std;
ll n,a,b,c,d;
int id,L,R,l,r;
int w[N]['z'+];
int h[N];
ll di[N],dp[N];
char s[N];
priority_queue<node,vector<node>,greater<node> > q;
bool calc(int i,int j,int k){
return di[i]**a*(di[j]-di[k])>=dp[j]-dp[k]+a*di[j]*di[j]-a*di[k]*di[k];
}
bool cal(int i,int j,int k){
return (di[j]-di[k])*(dp[i]-dp[j]+a*di[i]*di[i]-a*di[j]*di[j])<=(di[i]-di[j])*(dp[j]-dp[k]+a*di[j]*di[j]-a*di[k]*di[k]);
}
bool ok(int id,int i){
int s=-1e8;
for (int j='a';j<='z';j++)
s=max(s,w[i][j]-w[id][j]);
if (s>=L&&s<=R) return true;
return false;
}
int main(){
scanf("%lld%lld%lld%lld%lld%d%d",&n,&a,&b,&c,&d,&L,&R);
scanf("%s",s+);
for (int i=;i<=n;i++){
for (int j='a';j<='z';j++) w[i][j]=w[i-][j];
w[i][s[i]]++;
}
for (int i=;i<=n;i++)
scanf("%lld",&di[i]),di[i]+=di[i-];
l=; r=; id=;
for (int i=;i<=n;i++){
while (l<r&&calc(i,h[l+],h[l])) l++;
dp[i]=dp[h[l]]+a*(di[i]-di[h[l]])*(di[i]-di[h[l]])+b;
while (id<=i)
if (ok(id,i)){
q.push(make_pair(dp[id]-c*di[id],id));
id++;
} else break;
while (!q.empty()){
int f=q.top().second;
if (ok(f,i)){
dp[i]=min(dp[i],dp[f]+c*(di[i]-di[f])+d);
break;
} else{ q.pop(); continue; }
}
printf("%lld\n",dp[i]);
while (l<r&&cal(i,h[r],h[r-])) r--;
h[++r]=i;
}
return ;
}
YYHS-鏖战字符串的更多相关文章
- 【NOIP2017练习】鏖战字符串(斜率优化DP)
题意: 在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除.“量子态的字符串”的每个字符都有一个删除难度dif[i].“量子态的字符串”非常顽固,只能先分割成若 ...
- 校际联合Contest
每次开一个坑都像是重新被碾压的预感 最近的新闻,以前很喜欢乔任梁的<复活>...然后他就死了...感觉我再多愁善感一点的话...就要悲伤逆流成河了吧... Contest 09/24(乐滋 ...
- 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)
转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
随机推荐
- 【Linux】Apache Httpd 服务管理
基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐 [user@master1 ~]$ /usr/local ...
- java‘小秘密’系列(二)---Integer
java'小秘密'系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java'小秘 ...
- Javaweb向服务器上传文件以及从服务器下载文件的方法
先导入jar包 点击下载 commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流. comm ...
- python版mapreduce题目实现寻找共同好友
看到一篇不知道是好好玩还是好玩玩童鞋的博客,发现一道好玩的mapreduce题目,地址http://www.cnblogs.com/songhaowan/p/7239578.html 如图 由于自己太 ...
- JQuery操作iframe父页面与子页面的元素与方法
JQuery操作iframe父页面与子页面的元素与方法 JQUERY IFRAME 下面简单使用Jquery来操作iframe的一些记录,这个使用纯JS也可以实现. 第一.在iframe中查找父页面元 ...
- [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式
写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...
- 【译】怎样处理 Safari 移动端对图片资源的限制
原文作者:Thijs van der Vossen 本文翻译自<How to work around the Mobile Safari image resource limit>,原文写 ...
- Spark 1.6升级2.x防踩坑指南
原创文章,谢绝转载 Spark 2.x自2.0.0发布到目前的2.2.0已经有一年多的时间了,2.x宣称有诸多的性能改进,相信不少使用Spark的同学还停留在1.6.x或者更低的版本上,没有升级到2. ...
- 微软微服务eShopOnContainers示例之EventBusRabbitMq解析与实践
eShopOnContainers eShopOnContainers是微软官方的微服务架构示例,GitHub地址https://github.com/dotnet-architecture/eSho ...
- 使用nfs作为根文件系统启动,(3)
通过设置u-boot的bootargs来更改开机自动进入nfs远端服务器,不需要mount指令,实现虚拟机编译程序后直接通过u-boot烧写程序 1 使用nfs作为根文件系统启动 1.1 pr ...