题目描述

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

这是个二维平面世界,平面上有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. Hadoop 伪分布式安装配置

  2. LeetCode409Longest Palindrome最长回文串

    给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字符串的长度不 ...

  3. Redis源码解析:13Redis中的事件驱动机制

    Redis中,处理网络IO时,采用的是事件驱动机制.但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右. 没有选择 ...

  4. [Array] 561. Array Partition I

    Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...

  5. TZ_08_maven把第三方 jar 包放入本地仓库或私服

    --安装第三方jar包到本地仓库 需求:首先下载jar包并且找到对应的 -DgroupId=? -DartifactId=? -Dversion=? -Dpackaging=jar  -Dfile=j ...

  6. stackless 安装

    1.下载源码 https://bitbucket.org/stackless-dev/stackless/wiki/Download 2.编译.安装.路径生效 apt-get install libr ...

  7. jnhs-SpringMVC的controller向jsp传递数据的五种方式

    参考此文http://blog.sina.com.cn/s/blog_6d3c1ec601014h1h.html 1 使用ModelAndVoew 引入:org.springframework.web ...

  8. Java基础-注解

    什么是注解? Jdk1.5新增新技术,注解.很多框架为了简化代码,都会提供有些注解.可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件. 注解不会也不能影响代码的实 ...

  9. JSP-response(HttpServletResponse)

    1 HttpServletResponse概述 2 Response 运行过程 3 通过抓包工具抓取Http响应 4 响应行 5 设置响应头 set  和add的区别 6 重定向 需要完成分析‘ 6 ...

  10. python 产生二项分布图练习