题目描述

“我有个愿望,我希望穿越一切找到你。”

这是个二维平面世界,平面上有n个特殊的果实,我从(0,0)点出发,希望得到尽量多的果实,但是出于某种特殊的原因,我的运动方式只有三种(假设当前我在(x,y)):

1、我可以走到(x+1,y)

2、我可以走到(x,y+1)

3、我可以走到(x+1,y+1)

现在我需要你的帮助,帮我找出我最多能够得到多少个果实。

数据范围

对于70%的数据1<=n<=1000

对于100%的数据1<=n<=100000,-10^9<=x,y<=10^9

解法

离散化后动态规划,数据结构进行维护。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="find.in";
const char* fout="find.out";
const int inf=0x7fffffff;
const int maxn=100007,maxt=maxn*4;
int n,i,j,k,num,tot,totx,toty;
int fi[maxn],ne[maxn],la[maxn],en[maxn];
struct point{
int x,y;
}a[maxn];
bool cmp(point a,point b){
return a.y<b.y;
}
bool cmp1(point a,point b){
return a.x<b.x || a.x==b.x && a.y<b.y;
}
void add_line(int a,int b){
tot++;
if (fi[a]==0){
fi[a]=en[a]=tot;
la[tot]=b;
}else{
ne[en[a]]=tot;
en[a]=tot;
la[tot]=b;
}
}
int c[maxt],mark[maxt];
void markdown(int l,int r,int t){
if (mark[t]==0) return;
c[t]=max(c[t],mark[t]);
if (l<r){
mark[t*2]=max(mark[t*2],mark[t]);
mark[t*2+1]=max(mark[t*2+1],mark[t]);
}
mark[t]=0;
}
int getmax(int l,int r,int t,int v1,int v2){
int mid=(l+r)/2;
markdown(l,r,t);
if (l>v2 || r<v1) return 0;
if (l>=v1 && r<=v2) return c[t];
return max(getmax(l,mid,t*2,v1,v2),getmax(mid+1,r,t*2+1,v1,v2));
}
void change(int l,int r,int t,int v1,int v2,int v){
int mid=(l+r)/2;
markdown(l,r,t);
if (l>v2 || r<v1) return;
if (l>=v1 && r<=v2){
mark[t]=v;
markdown(l,r,t);
return;
}
change(l,mid,t*2,v1,v2,v);
change(mid+1,r,t*2+1,v1,v2,v);
c[t]=max(c[t*2],c[t*2+1]);
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++){
scanf("%d%d",&j,&k);
if (j>=0 && k>=0){
num++;
a[num].x=j;
a[num].y=k;
}
}
sort(a+1,a+num+1,cmp);
int last=a[1].y;
a[1].y=1;
for (i=2;i<=num;i++) if (a[i].y!=last) last=a[i].y,a[i].y=a[i-1].y+1;
else a[i].y=a[i-1].y;
toty=a[num].y;
sort(a+1,a+num+1,cmp1);
last=a[1].x;
a[1].x=1;
add_line(a[1].x,a[1].y);
for (i=2;i<=num;i++){
if (a[i].x!=last) last=a[i].x,a[i].x=a[i-1].x+1;
else a[i].x=a[i-1].x;
add_line(a[i].x,a[i].y);
}
totx=a[num].x;
for (i=1;i<=totx;i++){
for (k=fi[i];k;k=ne[k]){
j=la[k];
change(1,toty,1,j,toty,getmax(1,toty,1,1,j)+1);
}
}
int ans=getmax(1,toty,1,1,toty);
printf("%d",ans);
return 0;
}

【JZOJ4845】【NOIP2016提高A组集训第5场11.2】寻找的更多相关文章

  1. JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

    JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...

  2. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  3. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

  4. 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...

  5. 【NOIP2016提高A组集训第14场11.12】随机游走

    题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...

  6. 【NOIP2016提高A组集训第13场11.11】最大匹配

    题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...

  7. 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP

    好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...

  8. 【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵

    题目描述 他是一名普通的农电工,他以一颗无私奉献的爱岗敬业之心,刻苦钻研业务,以娴熟的技术.热情周到的服务赢得了广大客户的尊敬和赞美.他就是老百姓称为"李电"的李春来. 众所周知, ...

  9. 【JZOJ4898】【NOIP2016提高A组集训第17场11.16】人生的价值

    题目描述 NiroBC终于找到了人生的意义,可是她已经老了,在新世界,没有人认识她,她孤独地在病榻上回顾着自己平凡的一生,老泪纵横.NiroBC多么渴望再多活一会儿啊! 突然一个戴着黑色方框眼镜,方脸 ...

随机推荐

  1. Activiti实战01_认识Activiti

    什么是Activiti Activiti是为解决工作流而创建的一套流程引擎.举个最简单的例子,请假流程就是一个工作流,从开始到审批到结束,像流一样的贯穿整个流程.在工作中最常见的就是OA了.工作流总是 ...

  2. 忘记sql server 2008 sa的密码的解决方案

      解决的办法的前提是:可以混合模式登陆1.用windows身份验证登陆.2.新建查询3.输入 EXEC sp_password NULL, 'newPassword', sa搞定了

  3. [转]js作用域系列——内部原理

    前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域貌似简单,实则复杂,由于作用域与this机制非常容易混淆,使得理解作用域的原 ...

  4. Objective-C头文件导出工具class-dump

    首先,这个工具是开源的.作者网站:http://stevenygard.com/projects/class-dump/ 用途: 分析库文件或可执行文件,得到Objective-C类和部分C结构体的信 ...

  5. 轮播图js版&jQ版

    JS版轮播图 html部分和css部分自己任意定 主要构成: 1,一个固定的框 超出框的部分隐藏 2,几张图片float:left 3,下部下原点,点击切换,切换到不同的张都有红色显示 4,左右两个大 ...

  6. git pull 总提示让输入merge 信息

    在生产环境拉去代码的时候,总是出现了 .git/MERGE_MSG,很烦. 虽然每次可以通过输入 :q 命令,取消,然后完成拉取.但是这样就很影响效率.解决办法一: 欺骗自己法只要我没看见这个问题,这 ...

  7. Django项目:CRM(客户关系管理系统)--06--03PerfectCRM创建基本数据01

    os.path.join(BASE_DIR, 'DBadd/DBadd_templates'), """ Django settings for PerfectCRM p ...

  8. Laravel 精选资源大全

    原文链接  必备品 文档:Documentation API:API Reference 视频:Laracasts 新闻:Laravel News 中文文档 Laravel学院– Laravel 5. ...

  9. nested exception is org.hibernate.MappingException解决方案

    1.可能是因为映射文件( Order.hbm.xm)配置的class路径出错 <hibernate-mapping> <class name="com.web.bean.O ...

  10. 转搞定python多线程和多进程

    转自https://www.cnblogs.com/whatisfantasy/p/6440585.html 1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小 ...