问题描述

金矿的老师傅年底要退休了。经理为了奖赏他的尽职尽责的工作,决定在一块包含 n(n ≤ 15000) 个采金点的长方形土地中划出一块长度为 S ,宽度为 W 的区域奖励给他(1 ≤ s , w ≤ 10 000)。老师傅可以自己选择这块地的位置,显然其 中包含的采金点越多越好。你的任务就是计算最多能得到多少个采金点。如果一个采金点的位置在长方形的边上,它也应当被计算在内。

输入格式

输入文件的第一行有两个整数,中间用一个空格隔开,表示长方形土地的长和宽即s和w(1<=s,w<=10 000)。第二行有一个整数n(1<=n<=15 000),表示金矿数量。下面的n行与金矿相对应,每行两个整数x和y (-30 000<=x,y<=30 000),中间用一个空格隔开,表示金矿的坐标。

输出格式

输出文件只有一个整数,表示选择的最大金矿的数。

------------------------------------------------------------

正解=离散化+平衡树

  点比坐标小的多,离散之- =

  要求一个宽 s 长 w的且覆盖点最多的矩形

  维护一个宽度为  s 的带状区间 既满足宽度限制

  建立以y为关键字的平衡树维护之

  我们要求的既长度h的区间中的最大值

  将一个点x,y 拆成两个点

     x,y,权值为1

     x,y+h+1权值为-1

  维护一个这样的以y为第一关键字,权值为第二关键字的平衡树

  最大前缀和既长度h的区间中的最大值(Orz神差分前缀求和)

代码如下:

 #include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<map>
#include<queue>
#define LL long long
#define INF 999999999
#define Min(num1,num2) if(num1>num2) num1=num2
#define Max(num1,num2) if(num1<num2) num1=num2
#define N 150000
using namespace std ;
struct Point {
int x,y,neg,pos;
}point[N];
bool cmp(const Point &X,const Point &Y){
return X.x<Y.x;
}
struct Tree{
int l,r,f,v1,v2,sum,mmax;
}a[N];
int n,Root,Total,s,w,edge[N],top;
int q[];
void puit(int now){
printf("No.%d L:%d R:%d V1:%d V2:%d Sum:%d Mmax:%d\n",now,a[now].l,a[now].r,a[now].v1,a[now].v2,a[now].sum,a[now].mmax);
}
void update(int now){
// puit(now);
// printf("->\n");
// puit(a[now].l);
// puit(a[now].r);
// printf("-------------------------------\n");
a[now].sum=a[a[now].l].sum+a[a[now].r].sum+a[now].v2;
a[now].mmax=max(a[a[now].l].mmax,a[a[now].l].sum+a[now].v2 );
a[now].mmax=max(a[now].mmax ,a[a[now].l].sum+a[now].v2+a[a[now].r].mmax);
}
void put(int now){
if(a[now].l) put(a[now].l);
printf("%d ",a[now].v1);
//printf("V1%d(V2%d)(Sum%d)(Mmax%d) ",a[now].v1,a[now].v2,a[now].sum,a[now].mmax);
if(a[now].r) put(a[now].r);
}
void rig(int now){
int f=a[now].f;
a[now].f=a[f].f;
if(a[a[f].f].l==f) a[a[f].f].l=now;
if(a[a[f].f].r==f) a[a[f].f].r=now;
a[f].f=now;
a[f].l=a[now].r;
a[a[now].r].f=f;
a[now].r=f;
update(f);
}
void lef(int now){
int f=a[now].f;
a[now].f=a[f].f;
if(a[a[f].f].l==f) a[a[f].f].l=now;
if(a[a[f].f].r==f) a[a[f].f].r=now;
a[f].f=now;
a[f].r=a[now].l;
a[a[now].l].f=f;
a[now].l=f;
update(f);
}
void splay(int now,int F=){
while(a[now].f!=F){
int f=a[now].f;
int ff=a[f].f;
if(ff==F)
if(a[f].l==now)
rig(now);
else
lef(now);
else
if(a[ff].l==f)
if(a[f].l==now)
rig(f),rig(now);
else
lef(now),rig(now);
else
if(a[f].r==now)
lef(f),lef(now);
else
rig(now),lef(now);
}
update(now);
if(!F) Root=now;
}
int insert(int v1,int v2){
for(int now=Root;;){
q[++top]=now;
if(v1<a[now].v1||(v1==a[now].v1&&v2<=a[now].v2))
if(a[now].l) now=a[now].l;
else{
a[now].l=++Total;
a[Total].v1=v1;
a[Total].v2=v2;
a[Total].f=now;
a[Total].sum=v2;
a[Total].mmax=max(v2,);
break;
}
else
if(a[now].r) now=a[now].r;
else{
a[now].r=++Total;
a[Total].v1=v1;
a[Total].v2=v2;
a[Total].f=now;
a[Total].sum=v2;
a[Total].mmax=max(v2,);
break;
}
}
while(top) update(q[top--]);
splay(Total);
// put(Root);
// printf("\n");
return Total;
}
int prev(int now){
splay(now);
now=a[now].l;
while(a[now].r) now=a[now].r;
return now;
}
int succ(int now){
splay(now);
now=a[now].r;
while(a[now].l) now=a[now].l;
return now;
}
void del(int now){
int start=prev(now);
int end=succ(now);
splay(start);
splay(end,Root);
a[a[Root].r].l=;
update(a[Root].r);
update(Root);
}
void removeL(int now){
del(point[now].pos);
del(point[now].neg);
}
void removeR(int now){
point[now].pos=insert(point[now].y ,);
point[now].neg=insert(point[now].y+w+,-);
}
int main(){
scanf("%d%d%d",&s,&w,&n);
for(int i=;i<=n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
sort(point+,point++n,cmp);
point[].x=-INF;
int Maxedge=;
for(int i=;i<=n;i++)
if(point[i].x!=point[i-].x)
edge[++Maxedge]=point[i].x;
int L=,now=,R=,ans=;
Total=;
Root=;
a[].v1=INF;
a[].v1=-INF;
a[].l=;
a[].f=;
while(now<Maxedge){
++now;
while(edge[now]-point[L].x>s&&L <=n) removeL(L),++L;
while(point[R].x==edge[now] &&R <=n) removeR(R),++R;
Max(ans,a[Root].mmax); }
printf("%d",ans);
}

POI2001 金矿的更多相关文章

  1. POI2001 Gold mine(二叉排序树 黑书经典)

    采矿(KOP) 金矿的老师傅年底要退休了.经理为了奖赏他的尽职尽责的工作,决定送他一块长方形地.长度为S,宽度为W.老师傅可以自己选择这块地.显然其中包含的采金点越多越好.你的任务就是计算最多能得到多 ...

  2. Nginx日志中的金矿 -- 好文收藏

    转:http://www.infoq.com/cn/articles/nignx-log-goldmine Nginx(读作Engine-X)是现在最流行的负载均衡和反向代理服务器之一.如果你是一名中 ...

  3. 【POI2001】【HDU1814】和平委员会

    题面 Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条 ...

  4. 新一批创业者金矿,iclap谁与争锋

    19世纪,美国西部开发,无数拓荒者涌入,并最终因金矿的发现形成了淘金热.而当无数人埋头寻找黄金之时,有一个人却抬起头看到了潜藏在无数淘金者身上的金矿-这个人就是牛仔裤的发明者,Levi’s的创始人-李 ...

  5. COGS:313. [POI2001] 和平委员会

    313. [POI2001] 和平委员会 ★★☆   输入文件:spo.in   输出文件:spo.out   评测插件时间限制:1 s   内存限制:128 MB 题目描述 根据宪法,Bytelan ...

  6. [POI2001]Goldmine

    Description Byteman作为Byteland的The Goldmine(某一公司厂矿)的最有功的雇员之一,即将在年末退休.为了表示对他的 认真勤恳的工作的承认,The Goldmine的 ...

  7. 【转帖】PowerPC架构:IBM的一座金矿

    PowerPC架构:IBM的一座金矿 https://www.eefocus.com/mcu-dsp/365599 <处理器史话>之十五 2016-07-15 14:01 作者:付丽华预计 ...

  8. lb开金矿 QDUOJ 数论

    lb开金矿 QDUOJ 数论 原题链接,点我进去 题意 大家都知道lb有n个小弟(编号从2到n+1),他们可以按照规则传递信息:某天编号为i的小弟收到信息后,那么第二天他会给编号为j的小弟传达信息,其 ...

  9. 动态规划-国王的金矿问题java

    紧接着上一篇动态规划问题,现在我们开始探讨一个新的问题,问:有一个发现了5个金矿,每一个金矿的储量不同,需要参与挖掘的工人数也不通,参与挖矿工人的总数量是10人,每一座金矿要么全挖,要么不挖,不能派一 ...

随机推荐

  1. CentOS系统Apache服务器优化详解

    1.Apache优化 Apache能够在CentOS系统正常运行.但是,对于访问量稍大的站点,Apache的这些默认配置是无法满足需求的,我们仍需调整Apache的一些参数,使Apache能够在大访问 ...

  2. 【PHP】解决html网页乱码问题

    在自己制作一个网页时,时常会遇到网页乱码的问题. 其实导致网页乱码主要有几个原因,以下给出解决方法. 1.HTML的字符编码问题 该问题较常见,也是最明显和最容易解决的. 在网页<head> ...

  3. 新开窗口不被拦截的方法-window.open和表单提交form

    $("#btn").click(function() { var w = window.open(); setTimeout(function() { w.location = & ...

  4. css中 中文字体(font-family)的标准英文名称

    Mac OS的一些: 华文细黑:STHeiti Light [STXihei] 华文黑体:STHeiti 华文楷体:STKaiti 华文宋体:STSong 华文仿宋:STFangsong 儷黑 Pro ...

  5. php不允许用户提交空表单(php空值判断)

    我们在设计提交空的评论时依然可以写入数据库,并在页面显示出来.这显然是不合理的,所以需要我们加入空值判断 可以修改代码,添加些判断: 复制代码代码如下:   if(empty($_POST['name ...

  6. C# 拷贝数组的几种方式

    突然学到了,所以就放到博客上来共享一下,权当是学习日记吧. 首先说明一下,数组是引用类型的,所以注意不要在复制时复制了地址而没有复制数值哦! 其实在复制数组的时候,一定要用new在堆中开辟一块新的空间 ...

  7. We7在政府门户中的应用

    政府门户从传统的信息引导发展到现阶段的服务型门户,不论从角度转变上还是从平台选型上都跟以前有很大的不同,其更注重的是安全.扩展.易用和移动互联网几部分(当然这儿的注重是建立在已有政府门户电子政务三个板 ...

  8. Tekla Structures 使用类库概览

    Tekla Structures 2016 已经发布了,使用了 Ribbon 的全新 UI 风格,比以前要漂亮许多. 不过功能方面貌似没啥大的改进,感觉天宝的主要精力都投入到了混凝土模块上,忙着和别人 ...

  9. C++引用之引用的使用

    一旦一个引用被声明,则该引用名就只能作为目标变量名的一个别名来使用,所以,不能再把该引用名作为其他变量名的别名,任何对该引用的赋值就是对该引用对应的目标变量名的赋值. 对引用求地址就是对目标变量求地址 ...

  10. bzoj 3052: [wc2013]糖果公园 带修改莫队

    3052: [wc2013]糖果公园 Time Limit: 250 Sec  Memory Limit: 512 MBSubmit: 506  Solved: 189[Submit][Status] ...