标签:int set highlight typedef 过程 for 解决 ras algorithm
题意:给出一些点,如果存在一个$a$,使得(有点的横坐标大于$a$,有点的横坐标小于$a$,没有点的横坐标等于$a$)或(有点的纵坐标大于$a$,有点的纵坐标小于$a$,没有点的纵坐标等于$a$),则可以将它们分开,问最后可以把这些点分成多少份
题目提示得很明确了,就是要用分治的思想,直接找到分割的位置,递归处理
关键在于怎么着,如果扫一遍是会T的(如果运气不好,每次都在最后分割)
所以一头一尾向中间扫,最坏情况就是每次都在中间分割,这样是$O(nlog_2n)$的
扫的过程直接用两个set存点,一个以横坐标为第一关键字,另一个以纵坐标为第一关键字,就愉悦地解决了
#include<stdio.h>
#include<set>
#include<algorithm>
using namespace std;
struct point{
int x,y;
point(int a=0,int b=0){
x=a;
y=b;
}
};
struct cmpx{
bool operator()(point a,point b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
};
struct cmpy{
bool operator()(point a,point b){
if(a.y==b.y)return a.x<b.x;
return a.y<b.y;
}
};
bool ltx(point a,point b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
typedef set<point,cmpx> stx;
typedef set<point,cmpy> sty;
int conq(stx&sx,sty&sy){
if(sx.size()==1)return 1;
stx sx1;
sty sy1;
stx::iterator itx1;
stx::reverse_iterator itx2;
sty::iterator ity1;
sty::reverse_iterator ity2;
itx1=sx.begin();
itx2=sx.rbegin();
ity1=sy.begin();
ity2=sy.rbegin();
int t;
do{
t=itx1->x;
itx1++;
if(itx1->x-t>1){
while(sx.begin()->x<=t){
sx1.insert(*sx.begin());
sy1.insert(*sx.begin());
sy.erase(*sx.begin());
sx.erase(*sx.begin());
}
return conq(sx,sy)+conq(sx1,sy1);
}
t=itx2->x;
itx2++;
if(t-itx2->x>1){
while(sx.rbegin()->x>=t){
sx1.insert(*sx.rbegin());
sy1.insert(*sx.rbegin());
sy.erase(*sx.rbegin());
sx.erase(*sx.rbegin());
}
return conq(sx,sy)+conq(sx1,sy1);
}
t=ity1->y;
ity1++;
if(ity1->y-t>1){
while(sy.begin()->y<=t){
sx1.insert(*sy.begin());
sy1.insert(*sy.begin());
sx.erase(*sy.begin());
sy.erase(*sy.begin());
}
return conq(sx,sy)+conq(sx1,sy1);
}
t=ity2->y;
ity2++;
if(t-ity2->y>1){
while(sy.rbegin()->y>=t){
sx1.insert(*sy.rbegin());
sy1.insert(*sy.rbegin());
sx.erase(*sy.rbegin());
sy.erase(*sy.rbegin());
}
return conq(sx,sy)+conq(sx1,sy1);
}
}while(ltx(*itx1,*itx2));
return 1;
}
int main(){
int n,i,x,y;
stx sx;
sty sy;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&x,&y);
sx.insert(point(x,y));
sy.insert(point(x,y));
}
printf("%d",conq(sx,sy));
}
标签:int set highlight typedef 过程 for 解决 ras algorithm
原文地址:http://www.cnblogs.com/jefflyy/p/7896270.html