线段树之POJ2528 Mayor's posters

来源:互联网 发布:淘宝网店管理制度 编辑:程序博客网 时间:2024/06/05 16:03

成段替换。

个人认为这题重点是离散化。渣渣也是参考别人题解的,所以不班门弄斧了。

#include <stdio.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#include <limits.h>#include <math.h>#include <algorithm>#include <stack>#include <queue>#include <vector>#include <map>#include <string>#include <sstream>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long LL;const double pi=4.0*atan(1.0);const int MAXN=100005;int add[MAXN<<2];struct node{int x,y;};node poster[MAXN];int lisan[MAXN<<2];int biaoji[MAXN];void PushDown(int rt,int len){if(add[rt]){add[rt<<1]=add[rt];add[rt<<1|1]=add[rt];add[rt]=0;}}void build(int l,int r,int rt){add[rt]=0;if(l==r){return ;}int m=(l+r)>>1;build(lson);build(rson);}void update(int L,int R,int c,int l,int r,int rt){if(L<=l && r<=R){add[rt]=c;return ;}PushDown(rt,r-l+1);int m=(l+r)>>1;if(L<=m)update(L,R,c,lson);if(m<R)update(L,R,c,rson);}int ans;void query(int l,int r,int rt){if(add[rt]){if(biaoji[add[rt]]==0){ans++;biaoji[add[rt]]=1;}return ;}if(l==r)return ;int m=(l+r)>>1;query(lson);query(rson);}int lower(int x,int y,int k){int m;while(x<y){m=(x+y)/2;if(lisan[m]>=k)//改成<=可以求递减序列y=m;elsex=m+1;}return x;}int main(){int n,m;int i,j,k;int x,y;int T;while(scanf("%d",&T)!=EOF){while(T--){scanf("%d",&n);k=0;for(i=1;i<=n;i++){scanf("%d%d",&poster[i].x,&poster[i].y);lisan[k++]=poster[i].x;lisan[k++]=poster[i].y;}sort(lisan,lisan+k);k=unique(lisan,lisan+k)-lisan;for(i=k-1;i>0;i--){if(lisan[i]-lisan[i-1]>1){lisan[k++]=lisan[i]-1;}}sort(lisan,lisan+k);memset(biaoji,0,sizeof(biaoji));build(1,k,1);for(i=1;i<=n;i++){int nx=lower(0,k,poster[i].x);int ny=lower(0,k,poster[i].y);update(nx+1,ny+1,i,1,k,1);}ans=0;query(1,k,1);printf("%d\n",ans);}}return 0;}


0 0