洛谷题目页面传送门 & CodeForces题目页面传送门

给定一个\(n\)个单词的文本,第\(i\)个单词的长度为\(len_i\),要求截取文本的一段(单词必须取整的),分若干行放,同行单词用空格分隔,使得每行的长度不超过\(m\),最多放\(s\)行。求截取的单词数最多的截法。

\(n\in\left[1,10^6\right],\sum\limits_{i=1}^nlen_i\in\left[1,5\times10^6\right],ms\in\left[1,10^6\right]\)。

这道题想要AC还是很容易的。考虑枚举截取的第\(1\)个单词,然后计算往后最多能延申多少个单词,最后取个\(\max\)。重点在于如何计算往后最多能延申多少个单词,这个可以傻傻地贪心。先求出\(spl\)数组,表示从第\(i\)个单词开始最多能往后延申到第\(spl_i-1\)个单词放在一行。很显然,“是否能延申到第\(x\)个单词放在一行”具有单调性,于是\(spl\)数组可以\(\mathrm O(n\log n)\)配合前缀和二分求出。那么从第\(i\)个单词往后最多能延申的单词数就是\(\underbrace{spl_{spl_{spl_{\cdots_{i}}}}}_{s\text{次}spl\text{映射}}-i\)。这个又显然可以总共\(\mathrm O(n\log n)\)倍增求出。于是\(\mathrm O(n\log n)\)的复杂度是extremely easy的。

而我们是追求完美的OIer,这个复杂度能否达到\(\mathrm O(n)\)呢?带\(\log\)复杂度的地方有\(2\)个——求\(spl\)数组和\(s\)次\(spl\)映射,我们一个一个来看。

首先是求\(spl\)数组。不难发现,\(spl\)数组本身具有单调性,即\(spl_i\le spl_{i+1}\),那么我们可以从后往前two-pointers,求\(spl_i\)时,只需从\(spl_{i+1}\)到\(i\)从后往前试是否能延申到即可。其中边界是\(spl_{n+1}=n+1\)。这样所有单词均摊被试\(\mathrm O(n)\)次,时间复杂度就没有\(\log\)了。

接下来是映射。仍然利用\(spl\)数组的单调性,若在所有\(i\)和\(spl_i\)之间连一条边,若\(i=spl_i\)则不连边,那么一定会形成一个森林,而对\(i\)进行\(s\)次映射显然就等于节点\(i\)的\(\min(s,dep_i)\)辈祖先。我们对森林里的每一棵树进行DFS,同时维护一个递归栈\(stk\),那么\(\mathrm O(1)\)便可找到节点\(i\)的\(\min(s,dep_i)\)辈祖先,复杂度也变成整体\(\mathrm O(n)\)了。

下面贴代码:

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=1000000;
int n/*单词数*/,m/*每行最多能放的长度*/,s/*最多能放的行数*/;
string a[N+1];//单词们
int Sum[N+1];//前缀长度和(每个单词后面加上空格)
vector<int> son[N+2];int fa[N+2];//树,fa即spl数组
int stk[N+1],top;//递归栈
int ans[N+2];//从第i个单词开始最多能延伸的单词数
void dfs(int x){//对树DFS
stk[top++]=x;//将此节点入栈
ans[x]=stk[max(0,top-1-s)]-x;//O(1)找min(s,dep[i])辈祖先
for(int i=0;i<son[x].size();i++){
int y=son[x][i];
dfs(y);
}
top--;//出栈
}
int main(){
cin>>n>>s>>m;
for(int i=1;i<=n;i++)cin>>a[i],Sum[i]=Sum[i-1]+a[i].size()+1/*预处理前缀和*/;
fa[n+1]=n+1;//递推边界
for(int i=n;i;i--){//从后往前递推
fa[i]=fa[i+1];
while(Sum[fa[i]-1]-Sum[i-1]-1>m)fa[i]--;//从后往前试
if(fa[i]!=i)son[fa[i]].pb(i);//连边
}
// for(int i=1;i<=n+1;i++)cout<<fa[i]<<" ";puts("");
for(int i=1;i<=n+1;i++)if(fa[i]==i)top=0,dfs(i);//DFS每棵树
int mx=*max_element(ans+1,ans+n+2);//最大答案
for(int i=1;i<=n+1;i++)if(ans[i]==mx){
while(s--){//输出
for(int j=i;j<fa[i];j++)cout<<a[j]<<(j<fa[i]-1?" ":"\n");
i=fa[i];
}
return 0;
}
}

CodeForces 309B Context Advertising的更多相关文章

  1. Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)

    A. Straight «A» time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  2. Codeforces Round#415 Div.2

    A. Straight «A» 题面 Noora is a student of one famous high school. It's her final year in school - she ...

  3. 蓝牙inquiry流程之Advertising Report

    setting 界面开始搜索的时候,通常也会同时进行le scan,这一点在inquiry流程之命令下发中已经讲述.此篇文章主要是分析一下对于controller 搜索到的广播包的处理.这里以Andr ...

  4. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  5. spring源码分析之<context:property-placeholder/>和<property-override/>

    在一个spring xml配置文件中,NamespaceHandler是DefaultBeanDefinitionDocumentReader用来处理自定义命名空间的基础接口.其层次结构如下: < ...

  6. spring源码分析之context

    重点类: 1.ApplicationContext是核心接口,它为一个应用提供了环境配置.当应用在运行时ApplicationContext是只读的,但你可以在该接口的实现中来支持reload功能. ...

  7. CSS——关于z-index及层叠上下文(stacking context)

    以下内容根据CSS规范翻译. z-index 'z-index'Value: auto | <integer> | inheritInitial: autoApplies to: posi ...

  8. Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误——SHH框架

    SHH框架工程,Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误 1.查看配置文件web.xml中是否配置.or ...

  9. mono for android Listview 里面按钮 view Button click 注册方法 并且传值给其他Activity 主要是context

    需求:为Listview的Item里面的按钮Button添加一个事件,单击按钮时通过事件传值并跳转到新的页面. 环境:mono 效果: 布局代码 主布局 <?xml version=" ...

随机推荐

  1. jquery 统计统计子标签的个数

    本文实例讲述了jQuery获得子元素个数的方法.分享给大家供大家参考.具体分析如下://获取id=div1下的子元素的个数$('#div1').children().length;//获取id=div ...

  2. django @login_required登录限制

    参考文章:https://www.cnblogs.com/wodekaifalog/p/10817275.html 我们在网站开发过程中,经常会遇到这样的需求: 用户登陆系统才可以访问某些页面 如果用 ...

  3. git中ignore文件配置

    在项目中我们有一些文件是不能公开的,或者说是每个人需要单独配置的,那么这个时候使用 git 就不能上传这些文件.此时就需要对 .gitignore 文件进行配置. git 的忽略原则:参考 廖雪峰的g ...

  4. 基于web公交查询系统---站点信息管理

    界面设计: 界面设计代码获取: 搭建好框架获取信息: 核心代码: var users = [ ];//获取到的bus所有站点信息 var rowIndex = -1; $.ajax({ url: &q ...

  5. 淘宝IP地址库获取到省市IP地址

    http://ip.aliyun.com/index.html https://ispip.clang.cn/ https://github.com/Pingze-github/local-ips 1 ...

  6. Spring定时任务(@Scheduled)

    一.使用Spring的@Scheduled实现定时任务[1] 1.Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/s ...

  7. prometheus添加自定义监控与告警(etcd为例)

    一.步骤及注意事项(前提,部署参考部署篇) 一般etcd集群会开启HTTPS认证,因此访问etcd需要对应的证书 使用证书创建etcd的secret 将etcd的secret挂在到prometheus ...

  8. java中的Serializable接口

    实现java.io.Serializable 接口的类是可序列化的.没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化. 序列化类的所有子类本身都是可序列化的.这个序列化接口没有任何方法和域, ...

  9. Selenium基础教程(三)自动化插件Katalon

    Katalon-一款好用的selenium自动化测试插件 Selenium 框架是目前使用较广泛的开源自动化框架,一款好的.基于界面的录制工具对于初学者来说可以快速入门:对于老手来说可以提高开发自动化 ...

  10. [转帖]SQL Server 2000~2017补丁包

    SQL Server 2000~2017补丁包 https://www.cnblogs.com/VicLiu/p/11510510.html 最新更新 Product Version Latest S ...