线段树的区间更新,最简单的模型!
建树的时候需要离散化!离散时注意要将段改成点的区间,不然离散会出错的!虽然POJ数据水不会WA ,但是还是最一下比较好!
例如:
1
3
1 10
1 3 7 10
正确答案为3,离散错的话会得到答案2.
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<vector>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define nn 10010
#define LL long long
#define ULL unsiged long long
#define mod 0x7fffffff
#define inf oxfffffffffff
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int tree[nn<<3],a[nn<<1],s[nn<<1];
int u[nn],v[nn],pos[nn<<1];
void build(int l,int r,int rt)
{
tree[rt]=0;
if(l==r)
{
a[l]=0;
return;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void pushdown(int l,int r,int rt)
{
if(l==r)
return;
tree[rt<<1]=tree[rt<<1|1]=tree[rt];
tree[rt]=0;
}
void updata(int ll,int rr,int v,int l,int r,int rt)
{
if(ll<=l && rr>=r)
{
tree[rt]=v;
return;
}
if(tree[rt])
pushdown(l,r,rt);
int mid=(l+r)>>1;
if(ll<=mid)
updata(ll,rr,v,lson);
if(mid<rr)
updata(ll,rr,v,rson);
}
void down(int l,int r,int rt)
{
if(l==r)
{
a[l]=tree[rt];
return;
}
if(tree[rt])
pushdown(l,r,rt);
int mid=(l+r)>>1;
down(lson);
down(rson);
}
int binary(int v,int low,int top)
{
while(low<=top)
{
int mid=(low+top)>>1;
if(pos[mid]==v) return mid;
else if(pos[mid]>v) top=mid;
else low=mid+1;
}
}
int main()
{
int n,m,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
m=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&u[i],&v[i]);
v[i]++;//注意这里,离散的细节问题,不写不会WA,那是数据太水了!
pos[m++]=u[i];
pos[m++]=v[i];
}
sort(pos+1,pos+m);
int num=2;
for(int i=2;i<m;i++)
{
if(pos[i]!=pos[i-1])
pos[num++]=pos[i];
}
build(1,num-1,1);
m=1;
for(int i=1;i<=n;i++)
{
int ll=binary(u[i],1,num-1);
int rr=binary(v[i],1,num-1)-1;
//printf("%d %d %d\n",ll,rr,m);
updata(ll,rr,m,1,num-1,1);
/*down(1,num-1,1);
for(int i=1;i<(num<<2);i++)
printf("%d ",tree[i]);
printf("\n");*/
m++;
}
down(1,num-1,1);
memset(s,0,sizeof(s));
int ans=0;
/*for(int i=1;i<num;i++)
printf("%d ",a[i]);
printf("\n");*/
for(int i=1;i<num;i++)
{
if(!s[a[i]] && a[i])
{
ans++;
s[a[i]]++;
}
}
printf("%d\n",ans);
}
return 0;
}