zoukankan      html  css  js  c++  java
  • YYHS-鏖战字符串(斜率优化)

    题目描述

    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个字符中所有字符的出现次数

    所以每次判断一段区间是否可行的时候只要常数次操作就可以了。

     1 #include<bits/stdc++.h>
     2 #define N 100005 
     3 #define ll long long
     4 #define node pair<int,int>
     5 using namespace std;
     6 ll n,a,b,c,d;
     7 int id,L,R,l,r;
     8 int w[N]['z'+1];
     9 int h[N];
    10 ll di[N],dp[N];
    11 char s[N];
    12 priority_queue<node,vector<node>,greater<node> > q;
    13 bool calc(int i,int j,int k){
    14     return di[i]*2*a*(di[j]-di[k])>=dp[j]-dp[k]+a*di[j]*di[j]-a*di[k]*di[k];
    15 }
    16 bool cal(int i,int j,int k){
    17     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]);
    18 }
    19 bool ok(int id,int i){
    20     int s=-1e8;
    21     for (int j='a';j<='z';j++)
    22         s=max(s,w[i][j]-w[id][j]);
    23     if (s>=L&&s<=R) return true;
    24     return false;
    25 }
    26 int main(){
    27     scanf("%lld%lld%lld%lld%lld%d%d",&n,&a,&b,&c,&d,&L,&R);
    28     scanf("%s",s+1);
    29     for (int i=1;i<=n;i++){
    30         for (int j='a';j<='z';j++) w[i][j]=w[i-1][j];
    31         w[i][s[i]]++;
    32     }
    33     for (int i=1;i<=n;i++)
    34         scanf("%lld",&di[i]),di[i]+=di[i-1];
    35     l=0; r=0; id=0;
    36     for (int i=1;i<=n;i++){
    37         while (l<r&&calc(i,h[l+1],h[l])) l++;
    38         dp[i]=dp[h[l]]+a*(di[i]-di[h[l]])*(di[i]-di[h[l]])+b;
    39         while (id<=i)
    40             if (ok(id,i)){
    41                 q.push(make_pair(dp[id]-c*di[id],id));
    42                 id++;
    43             } else break;
    44         while (!q.empty()){
    45             int f=q.top().second;
    46             if (ok(f,i)){
    47                 dp[i]=min(dp[i],dp[f]+c*(di[i]-di[f])+d);
    48                 break;
    49             } else{ q.pop(); continue; }
    50         }
    51         printf("%lld
    ",dp[i]);
    52         while (l<r&&cal(i,h[r],h[r-1])) r--;
    53         h[++r]=i;
    54     } 
    55     return 0;
    56 } 
    View Code
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    AngularJS学习笔记1
    实习第2天
    转:JavaScript事件冒泡简介及应用
    icon font字体图标字库汇总
    Express4--说明
  • 原文地址:https://www.cnblogs.com/zhuchenrui/p/7571420.html
Copyright © 2011-2022 走看看