#树状数组,dp#SGU 521 North-East
题目
在平面上有 \(n\) 个点,现在有一个人要从某个点出发,
每次只能到达横纵坐标都超过原坐标的点,也就是 \(x_j<x_i,y_j<y_i\)
如果他要经过最多的点,那么哪些点是可能到达的,哪些点是必须到达的。
分析
按横坐标排序,实际上只需要管纵坐标,离散化之后直接用树状数组维护 \(dp[i]=dp[j]+1(y_j<y_i)\)
然后将序列翻转再做一遍,可能到达也就是 \(dp[i]+dp'[i]=ans-1\)
一定到达就是在可能到达的基础上,要保证 \(dp[i]\) 唯一,再统计一下 \(dp[i]\) 的个数即可。
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=100011;
struct rec{int x,y,rk;}a[N];
int c[N],n,ans[N],mx,f[N],g[N],m,b[N];
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
bool cmp(rec x,rec y){
return x.x<y.x||(x.x==y.x&&x.y<y.y);
}
int max(int a,int b){return a>b?a:b;}
void update(int x,int y){
for (;x<=m;x+=-x&x) c[x]=max(c[x],y);
}
int query(int x){
int ans=0;
for (;x;x-=-x&x) ans=max(ans,c[x]);
return ans;
}
int main(){
n=iut();
for (int i=1;i<=n;++i) a[i]=(rec){iut(),b[i]=iut(),i};
sort(a+1,a+1+n,cmp),sort(b+1,b+1+n),m=unique(b+1,b+1+n)-b-1;
for (int i=1;i<=n;++i) a[i].y=lower_bound(b+1,b+1+m,a[i].y)-b;
for (int l=1,r;l<=n;l=r+1){
for (r=l;r<=n&&a[r].x==a[l].x;++r); --r;
for (int i=l;i<=r;++i) f[i]=query(a[i].y-1)+1;
for (int i=l;i<=r;++i) update(a[i].y,f[i]);
}
for (int i=1;i<=m;++i) c[i]=0;
for (int r=n,l;r;r=l-1){
for (l=r;l&&a[l].x==a[r].x;--l); ++l;
for (int i=l;i<=r;++i) g[i]=query(m-a[i].y)+1;
for (int i=l;i<=r;++i) update(m-a[i].y+1,g[i]);
}
for (int i=1;i<=m;++i) c[i]=0;
for (int i=1;i<=n;++i) mx=max(mx,f[i]);
for (int i=1;i<=n;++i)
if (f[i]+g[i]-1==mx) ans[++ans[0]]=a[i].rk,++c[f[i]];
sort(ans+1,ans+1+ans[0]);
printf("%d ",ans[0]);
for (int i=1;i<=ans[0];++i) printf("%d ",ans[i]);
putchar(10),ans[0]=0;
for (int i=1;i<=n;++i)
if (f[i]+g[i]-1==mx&&c[f[i]]==1) ans[++ans[0]]=a[i].rk;
sort(ans+1,ans+1+ans[0]),printf("%d ",ans[0]);
for (int i=1;i<=ans[0];++i) printf("%d ",ans[i]);
return 0;
}
#树状数组,dp#SGU 521 North-East的更多相关文章
- codeforces 597C (树状数组+DP)
题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][k ...
- hdu 4622 Reincarnation trie树+树状数组/dp
题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...
- Codeforces 597C. Subsequences (树状数组+dp)
题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...
- HDU2227Find the nondecreasing subsequences(树状数组+DP)
题目大意就是说帮你给出一个序列a,让你求出它的非递减序列有多少个. 设dp[i]表示以a[i]结尾的非递减子序列的个数,由题意我们可以写出状态转移方程: dp[i] = sum{dp[j] | 1&l ...
- CodeForces - 314C Sereja and Subsequences (树状数组+dp)
Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a pie ...
- HDU 6348 序列计数 (树状数组 + DP)
序列计数 Time Limit: 4500/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- [Codeforces261D]Maxim and Increasing Subsequence——树状数组+DP
题目链接: Codeforces261D 题目大意:$k$次询问,每次给出一个长度为$n$的序列$b$及$b$中的最大值$maxb$,构造出序列$a$为$t$个序列$b$连接而成,求$a$的最长上升子 ...
- 【XSY2727】Remove Dilworth定理 堆 树状数组 DP
题目描述 一个二维平面上有\(n\)个梯形,满足: 所有梯形的下底边在直线\(y=0\)上. 所有梯形的上底边在直线\(y=1\)上. 没有两个点的坐标相同. 你一次可以选择任意多个梯形,必须满足这些 ...
- hdu5489 树状数组+dp
2015-10-06 21:49:54 这题说的是个给了一个数组,然后删除任意起点的一个连续的L个数,然后求最长递增子序列<是递增,不是非递减>,用一个树状数组维护一下就ok了 #incl ...
- hdu5125 树状数组+dp
hdu5125 他说的是n个人每个人都有两个气球a,b,气球各自都有相应的体积,现在让他们按照序号排列好来,对他们的a气球体积值计算最长上升子序列,对于这整个排列来说有m次机会让你将a气球替换成b气 ...
随机推荐
- 一秒出图?SDXL-Turbo实时AI绘画整合包下载
SDXL Turbo是一种快速生成的AI构图模型,它基于一种称为对抗性扩散蒸馏的新训练方法,该方法允许在1到4个步骤中以高图像质量对大规模基础图像扩散模型进行采样,并将其与对抗性损失相结合,以确保即使 ...
- FFmpeg开发笔记(八):ffmpeg解码音频并使用SDL同步音频播放
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- mysql安装及增删改查操作---day35
# ### mysql ''' 命令可以用tab来补全 d: D:\>cd MySQL5.7 D:\>cd D:\MySQL5.7\mysql-5.7.25-winx64\bin 直接切换 ...
- 【LeetCode递归】括号生成,使用dfs
括号匹配 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例 1: 输入:n = 3 输出:["((()))","(() ...
- 【八股cover#2】CPP语法 Q&A与知识点
CPP语法 Q&A与知识点 简历cover 1.熟练使用C的指针应用及内存管理 指针与引用的区别 指针是一个存储地址的变量,可以有多级,可以为空,并且在初始化后可以改变指向: 引用是原变量的别 ...
- Java面向对象之内部类的几类使用场景
介绍 Java内部类是一种特殊的类,它定义在另一个类的内部.内部类提供了许多有用的特性,包括访问外部类的私有成员.隐藏实现细节以及实现回调接口等.以下是Java内部类的一些常用场景及其举例说明: 回调 ...
- 【Azure 应用服务】[App Service For Linux(Function) ] Python ModuleNotFoundError: No module named 'MySQLdb'
问题描述 在使用Azure Function创建新的Python Function时,使用MySQLdb连接数据库时候出现 ModuleNotFoundError: No module named ' ...
- k8s资源管理中request和limit的区别
在 Kubernetes(K8s)中,request和limit是两个重要的概念,用于控制和管理容器的资源使用. Request(请求): request定义了容器启动时需要保证的最小资源量.这表示K ...
- 光感红外接近传感器AP3426调试总结
一 概念 AP3426是一个高度集成了红外,光感和接近角的传感器.该传感器凭借着高灵敏度广泛应用在可穿戴领域.笔者在一个产品上用了这个传感器.花了一些时间来调试和熟悉这个传感器,这里就做一个总结吧. ...
- 市场主流的G-sensor芯片盘点
一 前记 1.简介 随着可穿戴智能硬件的广泛发展,G-sensor成了一个必不可少的器件.梳理,测试和运用这些传感器.是做可穿戴产品必不可少的环节. 二 产品解析 1.ST的G-sensor型号LIS ...