[xsy3466]见面会
题意:有$n$个区间,把它们划分成若干段,如果一段$k$个区间的交长度$\geq2$,那么会产生$\binom k2$的贡献,最大化贡献
对每个$i$用单调栈预处理出$l_i$表示最小的$j$使得$j\cdots i$这些区间的交长度$\geq2$
设$f_i$表示前$i$个区间的答案,有$f_i=\max\limits_{j=l_i}^if_{j-1}+\binom{i-j+1}2$,直接线段树上维护凸壳已经可以做到$O(n\log n)$了,但我们有优秀线性做法
思路来源于这里的最后一段,orz人形自走题库yww
称$[l_i,i]$为“转移区间”
我们要说明存在一种划分$[1,n]$的方式使得每个转移区间都可以被拆成(划分出来的两个区间的后缀+前缀)
划分方法是这样的:一开始设切分点$j=0$,一遇到$l_i\gt j$就把$j$设为$i$
这样划分肯定不会有划分区间严格包含转移区间:如果包含,那么会更早切分
也不会有转移区间严格包含划分区间:因为$l_i$单调,所以会更迟切分
于是每个转移区间都被分成了划分区间的后缀+前缀,前缀可以边加入边更新答案
因为后缀能更新到的DP值都在下一个划分区间,所以在做完一整个划分区间时反着DP更新下一个划分区间的答案即可
特殊情况是转移区间就是划分区间的后缀,暴力就行
总时间复杂度$O(n)$
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef double du;
const ll inf=9223372036854775807ll;
void fmax(ll&a,ll b){
a<b?a=b:0;
}
struct line{
int k;
ll b;
ll v(ll x){
return k*x+b;
}
};
du its(line a,line b){
return(b.b-a.b)/(du)(a.k-b.k);
}
template<class t>bool gt(t a,t b){
return a>b;
}
template<class t>bool lt(t a,t b){
return a<b;
}
template<bool(*f)(int,int)>struct mq{
int a[300010];
int q[300010],h,t;
mq(){
h=1;
t=0;
}
void push(int i){
while(h<=t&&f(a[i],a[q[t]]))t--;
q[++t]=i;
}
void pop(int i){
if(q[h]==i)h++;
}
int v(){
return a[q[h]];
}
};
mq<gt>l;
mq<lt>r;
int li[300010];
bool cut[300010];
template<bool(*f)(du,du)>struct ms{
line st[300010];
int tp;
void push(line v){
while(tp>1&&f(its(v,st[tp]),its(st[tp],st[tp-1])))tp--;
st[++tp]=v;
}
ll v(int x){
if(!tp)return-inf;
while(tp>1&&f(x,its(st[tp],st[tp-1])))tp--;
return st[tp].v(x);
}
};
ms<gt>pre;
ms<lt>suf;
ll f[300010];
line v[300010];
int main(){
int n,i,j,k;
scanf("%d",&n);
j=1;
for(i=1;i<=n;i++){
scanf("%d%d",l.a+i,r.a+i);
l.push(i);
r.push(i);
while(r.v()-l.v()<1){
l.pop(j);
r.pop(j);
j++;
}
li[i]=j;
}
j=0;
for(i=1;i<=n;i++){
if(li[i]>j)cut[j=li[i]]=1;
}
cut[n]=1;
for(i=1;i<=n;i++)f[i]=-inf;
j=1;
for(i=1;i<=n;i++){
v[i]={-i,f[i-1]+((ll)i*i-i)/2};
if(li[i]<=j){
pre.push(v[i]);
fmax(f[i],pre.v(i));
}
if(cut[i]){
for(j=i;j>=li[i];j--)fmax(f[i],v[j].v(i));
f[i]+=((ll)i*i+i)/2;
pre.tp=0;
if(i<n){
suf.tp=0;
for(j=i+1;!cut[j];j++);
for(k=i;j>i;j--){
while(k>=li[j])suf.push(v[k--]);
fmax(f[j],suf.v(j));
}
}
j=i+1;
}else
f[i]+=((ll)i*i+i)/2;
}
printf("%lld",f[n]);
}
[xsy3466]见面会的更多相关文章
- 编程之美 set 15 高效率地安排见面会
题目 有 n 个学生分别对 m 个见面会感兴趣, 为了满足所有学生的要求, HR 希望每个学生都能参加自己感兴趣的所有见面会 思路 1. 假设某一个同学同时对k个小组感兴趣, 那么这k个小组两两之间都 ...
- 编程之美:1.9高效率安排见面会 图的m着色问题 回溯法
原书问题,可以转换为图的m着色问题 ,下面该问题的代码 这里有参考ppt与code,免积分载 http://download.csdn.net/detail/u011467621/6341195 // ...
- 上海MVP见面会
很愉快,很有收获的一次见面!
- 为什么你学过Java却忘光了——记第一次助教同学见面会
大约两周之前,主讲老师刘志勇老师和我约定,让我上周四到课堂上和同学们认识.交流一下.一开始我不太明了去和大家见面要说些什么,也不太理解这么做的必要性是什么.但随着日子临近,我请教了周筠老师,周筠老师和 ...
- 2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名
蛮牛杯启动了,大家开始报名! http://cup.manew.com/ 这不是一篇普通的通稿,别着急忽略它.它是一篇可以让你梦想变现的通稿! 从某一天开始,游戏蛮牛就立志要为开发者服务,我们深知这一 ...
- 【转载学习前辈的经验】-- Mistakes I made (as a developer) 我(作为一名开发者)所犯过的错误
我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不 ...
- CSS+DIV 设计一个简单的个人网页界面
*{ margin:0px; padding:0px; } body{ background:#e5e6d0; } #header,#menu,#banner,#main,#footer{ margi ...
- 个人阅读作业——M1/M2总结
~ http://www.cnblogs.com/wx1306/p/4831950.html 在这篇博客中,我提出来一些关于软件工程的问题,但随着这一个学期的即将结束,以及我对软件开发的了解的深入,我 ...
- TypeScript的全部资料,以后都放这儿了
很早之前就听说TypeScript了(以下简称TS),但总是用难以抽出时间给自己找到这个冠冕堂皇的理由.最近又心血来潮,打算写TS的博客了,毕竟TS核心开发者也是C#之父,像我这么热爱C#的人,怎么可 ...
随机推荐
- Oracle03--子查询
1. 子查询 子查询也称之为嵌套子句查询. 1.1. 语法 语法上的运行使用规则: l 子查询 (内查询.嵌套子句) 在主查询之前一次执行完成.(子查询先执行) l 子查询的结果被主查询使用 (外查询 ...
- spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解
题目链接:https://cn.vjudge.net/contest/276233#problem/C 题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但 ...
- 20165230 2017-2018-2 《Java程序设计》第9周学习总结
20165230 2017-2018-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十二章 java网络编程 学习了用于网络编程的类,了解URL.Socket.InetAdd ...
- 【codeforces】【比赛题解】#920 Educational CF Round 37
[A]浇花 题意: 一个线段上每个整点都有花,有的点有自动浇花的喷水器,有问几秒能浇完所有的花. 题解: 大模拟 #include<cstdio> #include<cstring& ...
- 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)
转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...
- NuGet套件还原步骤(以vs2012为例)
下载别人的范例,出现由于Nuget套件不存在而无法启动时: 效果如下图: 步骤如下: 1.点击 项目->启用NuGet程序包还原 2.点击下图中的是 3.点击下图中的确定 4.效果如图: . 5 ...
- 005_MAC下的VMware fushion快捷键(折中)
由于MAC和VMware Fushion虚拟机之间有一些快捷键的映射,所以Windows虚拟机就找了一个折中的方案.现总结MAC下的win常用快捷键==> <1>最小化窗口(Alt ...
- Java线程:新特征-有返回值的线程《转》
原始文章 在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. ...
- 再谈OPENCV(转)
转自:http://blog.csdn.net/carson2005/article/details/6979806 尽管之前写过一篇关于OpenCV的介绍(http://blog.csdn.net/ ...
- [USACO16OPEN]262144
传送门啦 其实大家可以先看一下这个题 [USACO16OPEN]248 分析: 数据范围很奇特:n特别,a[i]特别——如果O(N^3)能接受就直接区间DP水过了,但是不行,于是考虑设计一个状态囊括a ...