问题描述

金矿的老师傅年底要退休了。经理为了奖赏他的尽职尽责的工作,决定在一块包含 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. Windows7 下安装 CentOS6.5

    内容来自:http://blog.163.com/for_log/blog/static/2162830282013031031278/第一部分:安装前准备1. 准备两个fat32格式的分区,一个用于 ...

  2. 在类库或winform项目中打开另一个winform项目的窗体

    假设类库或winform项目为A,另一个winform项目为B.那麽在A中添加一个接口,里面有一个Show方法,然后在B中写一个类b继承这个接口,并重写这个方法,具体内容为弹出某个窗体.然后在A中另一 ...

  3. ssh登录docker容器

    ssh登录docker容器1.启动一个docker容器# docker run -t -i ubuntu/ruby:v1 /bin/bash2.然后在容器里,安装openssh-server open ...

  4. 从零到一:caffe-windows(CPU)配置与利用mnist数据集训练第一个caffemodel

    一.前言 本文会详细地阐述caffe-windows的配置教程.由于博主自己也只是个在校学生,目前也写不了太深入的东西,所以准备从最基础的开始一步步来.个人的计划是分成配置和运行官方教程,利用自己的数 ...

  5. C# RichTextBox 获取当前显示部分的文字

    int start = richTextBox1.GetCharIndexFromPosition(new Point(0, 0)); int end = richTextBox1.GetCharIn ...

  6. 使用XmlDocument.SelectNodes遍历xml元素遇到的一个XPathException

    使用XmlDocument类时候报错: 未处理的XPathException:需要命名空间管理器或 XsltContext.此查询具有前缀.变量或用户定义的函数. 需要使用XmlNamespaceMa ...

  7. ipad在非viewport 1:1下缩放问题

    1.最小会有980宽度,小于980应设置viewport 2.fix元素使用100%指定宽度时,默认会以min-width或980作为尺寸,可以选择给定与页面缩放时触发定宽来设置宽度,或设置设置bod ...

  8. JAVA 时间差距,两个时间相差多少天,时,分,秒

    JAVA 时间差距,两个时间相差多少天,时,分,秒 package io; import java.text.DateFormat; import java.text.ParseException; ...

  9. bzoj 1187: [HNOI2007]神奇游乐园 插头dp

    1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 668  Solved: 337[Submit][Statu ...

  10. 【2011 Greater New York Regional 】Problem G: Rancher's Gift

    计算几何的题目,很简单: 自己随手敲了个,纪念下! #include<cstdio> #include<cmath> using namespace std; struct p ...