线段树区间合并优化dp——cf1197E(好)
线段树优化dp的常见套路题,就是先按某个参数排序,然后按这个下标建立线段树,再去优化dp
本题由于要维护两个数据:最小值和对应的方案数,所以用线段树区间合并
/*
dp[i]表示第i个套娃作为最内层的最小浪费空间
dp[i]=min(dp[j])+out[i]-in[i];
那么按照out排序后按下标建立线段树,节点维护的是二元组(区间最小值,这个最小值对应的方案数)
求dp[i]时二分找到out[j]<=in[i]的区间[1,pos],然后线段树里查询再更新 处理方案数,线段树向上合并时,只保留值最小的那个节点信息即可,如果值相同,那么将方案数合并即可
初始值:如果一个娃外面套任何东西,那么这个娃的方案数设为1即*/ #include<bits/stdc++.h>
using namespace std;
#define N 200005
#define ll long long
#define mod 1000000007 inline ll f(ll a,ll b){
ll res=a+b;
if(res>mod)res-=mod;
return res;
} struct Node{ll out,in;}a[N];
bool operator<(Node a,Node b){return a.in<b.in;}
ll n,dp[N],x[N]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct Seg {
ll val,num;
Seg(){}
Seg(ll val,ll num):val(val),num(num){}
}seg[N<<];
Seg merge(Seg A,Seg B){
if(A.val<B.val)return A;
if(A.val>B.val)return B;
Seg res;
res.val=A.val;
res.num=(A.num+B.num)%mod;
return res;
}
void build(int l,int r,int rt){
seg[rt].num=;seg[rt].val=0x3f3f3f3f3f3f3f3f;
if(l==r)return;
int m=l+r>>;
build(lson);build(rson);
}
void update(int pos,ll val,ll num,int l,int r,int rt){
if(l==r){seg[rt].num=num;seg[rt].val=val;return;}
int m=l+r>>;
if(pos<=m)update(pos,val,num,lson);
else update(pos,val,num,rson);
seg[rt]=merge(seg[rt<<],seg[rt<<|]);
}
Seg query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return seg[rt];
int m=l+r>>;
Seg res;
res.val=0x3f3f3f3f3f3f3f3f;
if(L<=m)res=merge(res,query(L,R,lson));
if(R>m)res=merge(res,query(L,R,rson));
return res;
} void debug(int l,int r,int rt){
cout<<l<<" "<<r<<" "<<seg[rt].num<<" "<<seg[rt].val<<"\n";
if(l==r)return;
int m=l+r>>;
debug(lson);debug(rson);
} int main(){
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i].out>>a[i].in;
x[i]=a[i].in;
}
sort(a+,a++n);sort(x+,x++n); build(,n,);
for(int i=n;i>=;i--){
int pos=lower_bound(x+,x++n,a[i].out)-x;
if(pos>n){//外面套不了娃
update(i,a[i].in,,,n,);
}
else {
Seg res=query(pos,n,,n,);
//cout<<res.val<<" "<<res.num<<'\n';
update(i,res.val-(a[i].out-a[i].in),res.num,,n,);
//cout<<res.val<<" "<<res.num<<'\n';
}
//debug(1,n,1);
}
Seg res=query(,n,,n,);
cout<<res.num;
}
线段树区间合并优化dp——cf1197E(好)的更多相关文章
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- 【BZOJ3638】Cf172 k-Maximum Subsequence Sum 线段树区间合并(模拟费用流)
[BZOJ3638]Cf172 k-Maximum Subsequence Sum Description 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交 ...
- 【bzoj3638】Cf172 k-Maximum Subsequence Sum 模拟费用流+线段树区间合并
题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- HYSBZ 1858 线段树 区间合并
//Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- hdu3911 线段树 区间合并
//Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
随机推荐
- 流量隔离方案 Dpath 护航双十一新零售
需求 在今年的双11准备期间,业务同学提出要针对新零售进行特殊的保障,希望新零售过来的流量,单独进入到一批机器,和其他普通流量隔离开来,这对新零售系统稳定性提出更高的要求. 需求总结下来就是: 针对特 ...
- BZOJ 2653: middle(主席树+二分答案)
传送门 解题思路 首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为-1,然后就和GSS1那样统计答案.但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做 ...
- SpringMVC·form表单Date类型问题导致的400问题
问题描述 前端传yyyy-MM-dd hh:mm:ss格式的时间其实是String类型导致JavaBean中的Date类型Setter报错,从而导致api请求400. 问题解决 我的解决方式: 在对应 ...
- vue之slot用法
slot元素作为组件模板之中的内容分发插槽.这个元素自身将被替换. 有 name 特性的 slot 称为具名 slot. 有 slot 特性的内容将分发到名字相匹配的具名 slot. 一.单个组件 如 ...
- Nginx在Windows平台的配置
Nginx在Windows平台的配置 能够使用Nginx搭建Tomcat集群,并完成负载均衡. 1.什么是Nginx 2.为什么使用Nginx 背景: 互联网飞速发展的今天,大用户量高并发已经成为互联 ...
- centos 7 下升级自带 sqlite3
问题 在 centos 7 上面运行 django 2.2 开发服务器时出现: django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or ...
- SQLSERVER 时间日期函数,查询今天日期、昨天、一个星期、半年前的数据
今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0昨天的所有数据:select * from 表名 where D ...
- 用processing生成屏保程序
想法 利用随机数控制圆圈的大小.位置以及颜色,可以产生随机的美感. 让小球动起来,并且在屏幕边界处产生反弹效果. 代码 1: float circle_x = (float) 0.0; 2: floa ...
- Java web后台插入数据库中文乱码问题解决
前言:项目想要避免乱码情况的出现,要保持服务器.数据库.项目.以及前端编码一致.一.项目以及前端编码,设置. myeclipse--->右键项目--->Properties--->R ...
- (1.3)学习笔记之mysql体系结构(C/S整体架构、内存结构、物理存储结构、逻辑结构)
目录 1.学习笔记之mysql体系结构(C/S架构) 2.mysql整体架构 3.存储引擎 4.sql语句处理--SQL层(内存层) 5.服务器内存结构 6.mysql如何使用磁盘空间 7.mysql ...