| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
估计是把这题做全了,线段树离散化+中间增点,用vjudge多个OJ通过下面的数据
3
3
5 6
4 5
6 8
3
1 10
1 3
6 10
5
1 4
2 6
8 10
3 4
7 10
得出2 3 4的正确结果。
代码:
#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
#include <memory.h>
#define maxn 40010
using namespace std;
struct Node{
int left,right;
int type;
}data[maxn],de[4*maxn];
int N,ans;
bool vis[maxn];
vector<int>po,Map;
void BuildTree(int i,int left,int right)
{ de[i].left=left;
de[i].right=right;
de[i].type=-1;
if(left==right) return;
int mid=(left+right)>>1;
BuildTree(2*i,left,mid);
BuildTree(2*i+1,mid+1,right);
}
void PushDown(int i)
{ if(de[i].left!=de[i].right&&de[i].type!=-1)
{ de[2*i].type=de[2*i+1].type=de[i].type;
de[i].type=-1;
}
}
void Insert(int i,int left,int right,int cover)
{ if(left<=de[i].left&&de[i].right<=right)
{ de[i].type=cover;
return;
}
if(de[i].left==de[i].right) return;
PushDown(i);
int mid=(de[i].left+de[i].right)>>1;
if(right<=mid) Insert(2*i,left,right,cover);
else if(left>mid) Insert(2*i+1,left,right,cover);
else
{ Insert(2*i,left,mid,cover);
Insert(2*i+1,mid+1,right,cover);
}
}
void Query(int i,int left,int right)
{ if(de[i].type!=-1)
{ vis[de[i].type]=1;
return;
}
if(de[i].left==de[i].right) return;
int mid=(de[i].left+de[i].right)>>1;
if(right<=mid) Query(2*i,left,right);
else if(left>mid) Query(2*i+1,left,right);
else
{ Query(2*i,left,mid);
Query(2*i+1,mid+1,right);
}
}
void Solve()
{ int i,n,x,y;
sort(po.begin(),po.end());
po.erase(unique(po.begin(),po.end()),po.end());
n=po.size();
for(i=0;i<n-1;++i)
if(po[i+1]-po[i]>1)
po.push_back((po[i+1]+po[i])>>1);
sort(po.begin(),po.end());
for(i=0;i<po.size();++i)
Map.push_back(po[i]);
BuildTree(1,0,po.size()-1);
for(i=0;i<N;++i)
{ x=lower_bound(Map.begin(),Map.end(),data[i].left)-Map.begin();
y=lower_bound(Map.begin(),Map.end(),data[i].right)-Map.begin();
Insert(1,x,y,data[i].type);
}
ans=0;
memset(vis,0,sizeof(vis));
Query(1,0,po.size()-1);
for(i=0;i<N;++i)
if(vis[i])
ans++;
printf("%d\n",ans);
}
int main()
{ int T,i;
scanf("%d",&T);
while(T--)
{ scanf("%d",&N);
po.clear(),Map.clear();
for(i=0;i<N;++i)
{ scanf("%d %d",&data[i].left,&data[i].right);
data[i].type=i;
po.push_back(data[i].left);
po.push_back(data[i].right);
}
Solve();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator