题意:有N个点,有一个W*H的矩形,这个矩形和x,y轴平行,问你怎么放置这个矩形,能让矩形里的点最多。
思路: 把每个原点(x,y)对应再来个映点(x+w,y),这样就有2N个点。这N个原点每次在区间【y,y+h】加1,而N个映点在区间【y,y+h】减1。就保证当前线段树里的所有的点都是横坐标位于最早的那个x往右w之内,代表这个矩阵的左下角的纵坐标是[y,y+h]此时可另当前点合法。解释不清,看代码就懂了。
#include<bits/stdc++.h>
using namespace std;
const int N=4e4+5;
struct node{
int x,y,o;}a[N];
inline int cmp(node A,node B){
return (A.x==B.x)?(A.o>B.o):(A.x<B.x);}
int mx[N<<2],tag[N<<2];
void build(int l,int r,int pos){
mx[pos]=tag[pos]=0;
if(l==r