[BZOJ1852] [MexicoOI06]最长不下降序列
[BZOJ1852] [MexicoOI06]最长不下降序列
额我也不知道是不是水过去的。。。和网上的另一篇题解对拍过了,但是拍不出来。。。
经过和神仙的讨论基本可以确定是对的了
考虑如下贪心
(我将问题反过来考虑,也就是要满足\(A_i > \max_{j=1}^{j < i}{B_j}\))
按照\(b\)的值排序后,对于每一个\(i\)记录最大的\(B\)是\(B_i\)的最优解\(Max_i\)(注意这个其实是累过前缀和的)
接下来考虑每个\(i\),我们强制它产生贡献,找到前面最后一个\(B_j<A_i\),接在\(Max_j\)后面
由于这样做会跳过中间这一段,但事实上它们可能会产生贡献,所以我考虑将它们接在\(i\)的后面能否成立
也就是求\(\left| \lbrace A_k>B_i,{k \in [j+1,i-1]} \rbrace \right|\),这个我们可以离散+主席树在线搞定,或者可以离线
如此得到答案\(Max_n\) (在代码里就是\(dp\)数组。。)
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)
inline void cmax(int &a,int b){ ((a<b)&&(a=b));}
inline void cmin(int &a,int b){ ((a>b)&&(a=b));}
char IO;
int rd(){
int s=0,f=0;
while(!isdigit(IO=getchar())) f|=(IO=='-');
do s=(s<<1)+(s<<3)+(IO^'0');
while(isdigit(IO=getchar()));
return f?-s:s;
}
const int N=2e5+10,K=15;
const int R=1e5;
int n;
struct Node{
int a,b;
bool operator < (const Node __) const {
return b<__.b;
}
}A[N];
int h[N],hc;
int dp[N];
int rt[N*K],s[N*K],ls[N*K],rs[N*K],cnt;
void Add(int p,int pre,int l,int r,int x) {
s[p]=s[pre]+1;
if(l==r) return;
int mid=(l+r)>>1;
ls[p]=ls[pre],rs[p]=rs[pre];
x<=mid?Add(ls[p]=++cnt,ls[pre],l,mid,x):Add(rs[p]=++cnt,rs[pre],mid+1,r,x);
}
int Que(int pl,int pr,int l,int r,int ql,int qr) {
if(ql>qr) return 0;
if(ql==l&&qr==r) return s[pr]-s[pl];
int mid=(l+r)>>1;
if(qr<=mid) return Que(ls[pl],ls[pr],l,mid,ql,qr);
else if(ql>mid) return Que(rs[pl],rs[pr],mid+1,r,ql,qr);
else return Que(ls[pl],ls[pr],l,mid,ql,mid)+Que(rs[pl],rs[pr],mid+1,r,mid+1,qr);
}
int main(){
rep(i,1,n=rd()) {
A[i].a=rd(),A[i].b=rd();
h[++hc]=A[i].a,h[++hc]=A[i].b;
}
sort(h+1,h+hc+1),hc=unique(h+1,h+hc+1)-h-1;
sort(A+1,A+n+1);
rep(i,1,n) {
A[i].a=lower_bound(h+1,h+hc+1,A[i].a)-h;
A[i].b=lower_bound(h+1,h+hc+1,A[i].b)-h;
Add(rt[i]=++cnt,rt[i-1],1,hc,A[i].a);
}
rep(i,1,n) {
int l=1,r=i-1,res=0;
while(l<=r) {
int mid=(l+r)>>1;
if(A[mid].b<A[i].a) l=mid+1,res=mid;
else r=mid-1;
}
dp[i]=max(dp[i-1],dp[res]+1+Que(rt[res],rt[i-1],1,hc,A[i].b+1,hc));
}
int ans=dp[n];
printf("%d\n",ans);
}
离线做法
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)
char IO;
int rd(){
int s=0,f=0;
while(!isdigit(IO=getchar())) f|=(IO=='-');
do s=(s<<1)+(s<<3)+(IO^'0');
while(isdigit(IO=getchar()));
return f?-s:s;
}
const int N=2e5+10,K=15;
int n;
struct Node{
int a,b;
bool operator < (const Node __)const{ return b<__.b; }
}A[N];
struct Query{
int x,p,id,k;
bool operator < (const Query __)const{ return p<__.p; }
}Q[N<<1];
int qc,h[N],hc,dp[N];
int L[N],Ans[N];
int s[N];
void Add(int p,int x){ while(p) s[p]+=x,p-=p&-p; }
int Que(int p){
int res=0;
while(p<=hc) res+=s[p],p+=p&-p;
return res;
}
int main(){
rep(i,1,n=rd()) {
A[i].a=rd(),A[i].b=rd();
h[++hc]=A[i].a,h[++hc]=A[i].b;
}
sort(h+1,h+hc+1),hc=unique(h+1,h+hc+1)-h-1;
sort(A+1,A+n+1);
rep(i,1,n) {
A[i].a=lower_bound(h+1,h+hc+1,A[i].a)-h;
A[i].b=lower_bound(h+1,h+hc+1,A[i].b)-h;
}
rep(i,1,n) {
int l=1,r=i-1,res=0;
while(l<=r) {
int mid=(l+r)>>1;
if(A[mid].b<A[i].a) l=mid+1,res=mid;
else r=mid-1;
}
L[i]=res;
if(i-1>L[i]) Q[++qc]=(Query){A[i].b+1,i-1,i,1},Q[++qc]=(Query){A[i].b+1,L[i],i,-1};
}
sort(Q+1,Q+qc+1);
int p=1;
rep(i,0,n) {
if(i) Add(A[i].a,1);
while(p<=qc && Q[p].p<=i) Ans[Q[p].id]+=Q[p].k*Que(Q[p].x),p++;
}
rep(i,1,n) dp[i]=max(dp[i-1],dp[L[i]]+1+Ans[i]);
int ans=dp[n];
printf("%d\n",ans);
}
[BZOJ1852] [MexicoOI06]最长不下降序列的更多相关文章
- BZOJ 1852 [MexicoOI06]最长不下降序列(贪心+DP+线段树+离散化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1852 [题目大意] 给你N对数A1,B1……An,Bn.要求你从中找出最多的对, 把它 ...
- 问题 B: 【例9.3】求最长不下降序列(基础dp)
问题 B: [例9.3]求最长不下降序列 时间限制: 1 Sec 内存限制: 128 MB提交: 318 解决: 118[提交][状态][讨论版][命题人:quanxing] 题目描述 设有由n( ...
- 算法复习——求最长不下降序列长度(dp算法)
题目: 题目背景 161114-练习-DAY1-AHSDFZ T2 题目描述 有 N 辆列车,标记为 1,2,3,…,N.它们按照一定的次序进站,站台共有 K 个轨道,轨道遵从先进先出的原则.列车进入 ...
- JDOJ 1929: 求最长不下降序列长度
JDOJ 1929: 求最长不下降序列长度 JDOJ传送门 Description 设有一个正整数的序列:b1,b2,-,bn,对于下标i1<i2<-<im,若有bi1≤bi2≤-≤ ...
- 最长不下降序列nlogn算法
显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...
- dp最长不下降序列
// // Created by snnnow on 2020/4/13. // //这是dp 问题的基础题 // //最长不下降 //(导弹拦截是其例题) //那这篇文章是讲啥呢, // 主要是吧, ...
- 九度OJ 1131:合唱队形 (DP、最长上升下降序列)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2865 解决:881 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. ...
- dp入门:最长不下降序列
#include "bits/stdc++.h" using namespace std; ],dp[]; int main() { int n; cin >> n; ...
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...
随机推荐
- python asyncio wait和gather
1. wait, 等待某某执行完成以后才执行下一步 FIRST_COMPLETED = concurrent.futures.FIRST_COMPLETED FIRST_EXCEPTION = con ...
- 截图自动添加水印图片工具 pickpick设置中文语言
推荐一款截图工具,主要是可以截图自动带水印,效果不错 最近发现我的不少文章被转载的到处都是.乱七八糟,这个功能后续准备做个水印用起来,感觉不错 主角介绍 首先介绍下主角 PickPick
- MySQL for OPS 07:主从复制
写在前面的话 对于企业而言,在互联网这一块其实最重要的是数据.保证数据的安全性,稳定性是作为运维人的基本工作职责.于是为了数据安全性,引进了数据备份,bin log 等.但这并不意味着有这些就足够了. ...
- War 包部署
Springboot 进行war包部署,以及踩坑历险!!! https://www.jianshu.com/p/4c2f27809571 Springboot2项目配置(热部署+war+外部tomca ...
- SQL和T-SQL之间的区别
对于SQL,在我的上一篇博客中<何谓SQL Server数据库?与Access数据库 有什么区别>里面,已经着重说明了SQL作为访问和处理数据库的标准的计算机语言,所以这里就不做过多强调. ...
- python匹配ip地址
ip地址是用3个'.'号作为分隔符,分割4个数字,每个数字的取值在[0,255],一般日志文件中的ip地址都是有效的ip地址,不需要我们再去验证,因此,若从日志文件中提取ip,那么可以简单写成这样: ...
- maven 学习---使用Maven创建Java项目
在本教程中,我们将向你展示如何使用 Maven 来创建一个 Java 项目,导入其到Eclipse IDE,并打包 Java 项目到一个 JAR 文件. 所需要的工具: Maven 3.3.3 Ecl ...
- 项目进程中input的onblur事件挂不上去,失效问题解决记录
一开始直接在js文件中写 var n=document.querySelector("input"); n.onblur=funcition(){ ///事件过程吧啦啦啦 }; 事 ...
- 关于微信小程序中遇到的各种问题汇总(持续更新)
1.关于 <input />标签容易忽略的问题: 使用<input />标签时容易忘记绑定bindblur()方法(输入框失去焦点时触发),因为用户用键盘输入时不一定会点击完成 ...
- 使用GCP_EC2云服务器搭部署网络服务
首先,在此阿里云/腾讯云/华为云购买一个云服务器推荐使用阿里云的 首先链接你的VPS,可以使用X-shell / Putty / SecureCRTPortable 等SSH链接工具 注意:如果不知道 ...