【JZOJ4845】【NOIP2016提高A组集训第5场11.2】寻找
题目描述
“我有个愿望,我希望穿越一切找到你。”
这是个二维平面世界,平面上有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】寻找的更多相关文章
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...
- 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 ...
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...
- 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...
- 【NOIP2016提高A组集训第14场11.12】随机游走
题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...
- 【NOIP2016提高A组集训第13场11.11】最大匹配
题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...
- 【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵
题目描述 他是一名普通的农电工,他以一颗无私奉献的爱岗敬业之心,刻苦钻研业务,以娴熟的技术.热情周到的服务赢得了广大客户的尊敬和赞美.他就是老百姓称为"李电"的李春来. 众所周知, ...
- 【JZOJ4898】【NOIP2016提高A组集训第17场11.16】人生的价值
题目描述 NiroBC终于找到了人生的意义,可是她已经老了,在新世界,没有人认识她,她孤独地在病榻上回顾着自己平凡的一生,老泪纵横.NiroBC多么渴望再多活一会儿啊! 突然一个戴着黑色方框眼镜,方脸 ...
随机推荐
- debian下编译安装poco
系统环境: debian版本:Linux localhost.localdomain 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC ...
- SVN添加自动忽略文件.settings .project .classpath target等
eclipse svn提交忽略文件及文件夹,ignore设置无效.. 一.方法: 1. 将文件夹或文件从Eclipse中删除.记得要在Eclipse中删除,而不是Windows文件管理界面删除. 2. ...
- (codeforces 853A)Planning 贪心
Helen works in Metropolis airport. She is responsible for creating a departure schedule. There are n ...
- Go之路一
一.声明变量 var a int var b string var c []float32 var d func() bool var e struct{ x int } 第1行,声明一个整型类型的变 ...
- CodeForces - 627A
CodeForces - 627Ahttps://vjudge.net/problem/326413/origina+b == (a&b)<<1 +(a^b);然后是位运算,如果对 ...
- python 获取天气信息
[说明]接口为聚合数据接口.API使用说明: 实现代码: import requests,json def main(): #参数 farmat=1 cityname = input("请输 ...
- java并发系列(六)-----Java并发:volatile关键字解析
在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保证可见性 ...
- fiddler替换服务器上文件进行本地调试
在我们前端开发的日常工作中,发现服务器上某个css/javascript文件有问题,需要修改,那真是家常便饭.通常,我们需要将文件进行修改,然后重新发布再验证,这样就很容易影响到生产环境的稳定性.更普 ...
- 你应该知道的25个非常有用的CSS技巧
在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单. 说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与 ...
- 删除 BIRT Report Viewer
去掉首页上的标题BIRT Report Viewer方法:找到Webroot\webcontent\birt\pages\layout\FramesetFragment.jsp文件,在里面定义了标题, ...