题目描述

Abwad在nbc即将完成她的程序的时候,急中生智拔掉了她电脑的电源线,争取到了宝贵的时间。作为著名论文《论Ctrl-C与Ctrl-V在信息学竞赛中的应用》的作者,他巧妙地使用了这种上古秘术,顺利扳回一城。
在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除。“量子态的字符串”的每个字符都有一个删除难度dif[i]。“量子态的字符串”非常顽固,只能先分割成若干个子串,然后再通过以下两种方式删除:
1、假设子串的所有字符的删除难度之和为x,消耗a*x2+b的时间可以将子串扔进回收站。
2、若子串中出现次数最多的字符出现的次数不少于l次且不多于r次,那么采用“量子态的py自动机”算法可以消耗c*x+d的时间将子串扔进回收站。
Abwad自然知道最少用多少时间就能将字符串删去,因此,他希望你求出删去每个前缀[1,i]的最少用时。

输入

第一行七个整数n,a,b,c,d,l,r,其中n表示字符串的长度
第二行一行一个长度为n的字符串
第三行一行n个整数,表示每个字符的删除难度dif[I]

输出

n行,每行一个整数ans,表示删去前缀[1,i]最短的时间

样例输入

5 1 3 1 5 1 1 abwad 1 1 1 1 1

样例输出

4 7 8 12 13

提示

【样例解释】
以前缀[1,n]为例,将串分为a、bwad两个子串,用方法1删去第一个子串,用方法2删去第二个子串,用时1*1+3+1*4+5=13
【限制与约定】

测试点编号

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
对于所有的数据,满足n≤100000,1≤a,b,c,d≤233,1≤l,r≤n,dif[i]≤50,所有字符由小写字母组成。
【后记】
在Abwad和nbc同时将最后一个子串删去时,一个带着黑色方框眼镜,方脸,穿着高腰裤的长者,乘着圣洁的祥云,飞进了YYHS的机房。在他伟大的思想的启发下,Abwad和nbc终于放下了对名利的追逐,找到了人生的意义——吃吃吃。从此,他们过上了幸福快乐的生活……
 

题解

这道题刚开始只想到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-鏖战字符串的更多相关文章

  1. 【NOIP2017练习】鏖战字符串(斜率优化DP)

    题意: 在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除.“量子态的字符串”的每个字符都有一个删除难度dif[i].“量子态的字符串”非常顽固,只能先分割成若 ...

  2. 校际联合Contest

    每次开一个坑都像是重新被碾压的预感 最近的新闻,以前很喜欢乔任梁的<复活>...然后他就死了...感觉我再多愁善感一点的话...就要悲伤逆流成河了吧... Contest 09/24(乐滋 ...

  3. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  4. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  5. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  6. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  7. JavaScript 字符串实用常操纪要

    JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...

  8. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  9. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

随机推荐

  1. eclipse中使用Maven管理java工程设置jdk版本为jdk1.8

    使用Maven管理Java工程时,maven可以自动下载工程中依赖的jar包,这对于大型的项目非常方便.但在初次使用eclipse新建maven工程时遇到一些问题,我的jdk安装的是1.8版本,在配置 ...

  2. 输入输出系统--I/O接口

    计算机组成原理\硬件结构\输入输出系统\I/O接口 一.概述 接口可以看做是两个系统或两个部件之间的交接部分,它即可以是两种硬设备之间的连接电路,也可以是两个软件之间共同的逻辑边界. I/O接口通常是 ...

  3. Win10个性化设置

    Win10个性化设置.. ---------------------- Capture001-我的桌面 ---------------------- Win10设置任务栏的颜色 ----------- ...

  4. Spring MVC控制层传递对象后在JSP页面中的取值方法

    List<Order> orders = new ArrayList<Order>(); for (int i = 0; i < 3; i++) { Order t = ...

  5. 关于jsp页面转换成excel格式下载遇到问题及解决

    jsp页面转成excel格式的实现思路: 1.使用poi包:poi-bin-3.9-20121203 下载连接地址:http://www.apache.org/dyn/closer.cgi/poi/r ...

  6. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

  7. el表达式里面fn的用法

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp31 头部加入标签库 <%@ taglib prefix=" ...

  8. IOS学习【xcode 7新特性url链接】

    由于xcode7的更新,在访问http链接的时候会输出错误信息 The resource could not be loaded because the App Transport Security ...

  9. jQuery高级Ajax

    .load();加载远程的HTML文件代码,并插入到指定的DOM节点中.可以只传入一个参数,表示加载一个静态的HTML代码片段. $("#div1").load("loa ...

  10. YYHS-怎样更有力气

    题目描述 OI大师抖儿在夺得银牌之后,顺利保送pku.这一天,抖儿问长者:"我虽然已经保送了,但我的志向是为国家健康工作五十年.请问我应该怎样变得更有力气?"  长者回答:&quo ...