记录编号 95366 评测结果 AAAAAAAAAAAAAAA
题目名称 [POI 2001] 金矿 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.170 s
提交时间 2014-04-05 21:06:30 内存使用 0.43 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int SIZEN=15000+1000,INF=0x7fffffff;
int max(int a,int b,int c){return max(a,max(b,c));}
class SPLAYTREE{
public:
	class NODE{
	public:
		int key,data;//坐标和这个点的值
		int size;//子树大小
		int sum,mx;//子树和,最大前缀和
		NODE *lc,*rc,*f;
		NODE(int y,int t){size=1;key=y,data=sum=mx=t;}
		NODE(){NODE(0,0);}
	}*Nil,*left,*right,*Root;
	NODE* newNODE(int y,int t){
		NODE *T=new NODE(y,t);
		T->lc=T->rc=T->f=Nil;
		return T;
	}
	SPLAYTREE(){
		Nil=new NODE(INF/2,0);
		Nil->lc=Nil->rc=Nil->f=Nil;
		Nil->sum=Nil->mx=Nil->size=0;
		left=new NODE(-INF,0),right=new NODE(INF,0);
		left->lc=left->rc=left->f=Nil;
		right->lc=right->rc=right->f=Nil;
		left->sum=left->mx=right->sum=right->mx=0;
		left->rc=right,right->f=left;
		(left->size)++,Root=left;//边界节点
	}
	void update(NODE *T){
		T->size=T->lc->size+T->rc->size+1;
		T->sum=T->lc->sum+T->rc->sum+T->data;
		T->mx=max(T->lc->mx,T->lc->sum+T->data,T->lc->sum+T->data+T->rc->mx);
	}
	void zig(NODE *T){//右旋
		NODE *P=T->f,*rson=T->rc;
		if(Root==P) Root=T;
		else (P->f->lc==P)?P->f->lc=T:P->f->rc=T;
		T->f=P->f;P->f=T;
		T->rc=rson->f=P;P->lc=rson;
		update(P);
	}
	void zag(NODE *T){//左旋
		NODE *P=T->f,*lson=T->lc;
		if(P==Root) Root=T;
		else P->f->lc==P?P->f->lc=T:P->f->rc=T;
		T->f=P->f;P->f=T;
		T->lc=lson->f=P;P->rc=lson;
		update(P);
	}
	void splay(NODE *ANC,NODE *t){//t转到ANC
		if(t==ANC){
			update(t);
			return;
		}
		bool reach=false;
		while(!reach){
			NODE *P=t->f;
			if(P==ANC) (P->lc==t)?zig(t):zag(t),reach=true;
			else{
				if(P->f==ANC) reach=true;
				if(P->f->lc==P) (P->lc==t)?zig(P):zag(t),zig(t);
				else (P->lc==t)?zig(t):zag(P),zag(t);
			}
		}
		update(t);
	}
	void insert(NODE *T,int key,int data){//如果有则该点加data,否则新建一个点
		if(T->key==key){
			T->data+=data;
			splay(Root,T);
			return;
		}
		if(key<T->key){
			if(T->lc==Nil){
				T->lc=newNODE(key,data);
				T->lc->f=T;
				splay(Root,T->lc);
			}
			else insert(T->lc,key,data);
		}
		else{
			if(T->rc==Nil){
				T->rc=newNODE(key,data);
				T->rc->f=T;
				splay(Root,T->rc);
			}
			else insert(T->rc,key,data);
		}
	}
	void insert(int key,int data){
		insert(Root,key,data);
	}
}tree;
int ans=0;
int N;
pair<int,int> mine[SIZEN];
int S,W;
void work(void){
	int i=1,j,p=1;
	while(i<=N){
		j=i;
		while(j<=N&&mine[j].first==mine[i].first) j++;j--;
		//i~j为一段
		for(int k=i;k<=j;k++){
			tree.insert(mine[k].second,1);
			tree.insert(mine[k].second+W+1,-1);
		}
		while(mine[p].first<mine[i].first-S){
			tree.insert(mine[p].second,-1);
			tree.insert(mine[p].second+W+1,1);
			p++;
		}
		i=j+1;
		ans=max(ans,tree.Root->mx);
	}
	printf("%d\n",ans);
}
void read(void){
	scanf("%d%d%d",&S,&W,&N);
	for(int i=1;i<=N;i++) scanf("%d%d",&mine[i].first,&mine[i].second);
	sort(mine+1,mine+1+N);
}
int main(){
	freopen("kop.in","r",stdin);
	freopen("kop.out","w",stdout);
	read();
	work();
	return 0;
}