| ||||||||||
| 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 | |||||||||
我表示这个题真心不用线段树。我为什么用了一个堆就过了?
/*
* poj2528heap.cpp
*
* Created on: 2012-1-20
* Author: dxhisboy
*/
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using std::sort;
using std::priority_queue;
bool past[10010],show[10010];
struct event{
int num,pos;
bool left;
bool operator<(const event &b)const{
if (pos<b.pos) return true;
if (pos>b.pos) return false;
if (left&&!b.left) return true;
if (!left&&b.left) return false;
if (left&&b.left) return num>b.num;
return num<b.num;
}
} a[22000];
priority_queue<int> q;
int main(){
int t;
scanf("%d",&t);
while (t--){
int n;
scanf("%d",&n);
memset(past,0,sizeof(past));
memset(show,0,sizeof(show));
for (int i=1;i<=n;i++){
scanf("%d%d",&a[i+i-1].pos,&a[i+i].pos);
a[i+i-1].left=true;a[i+i-1].num=i;
a[i+i].left=false;a[i+i].num=i;
}
sort(a+1,a+n+n+1);
a[n+n+1].pos=-1;
while (!q.empty()) q.pop();
for (int i=1;i<=n+n;i++){
if (!q.empty()&&a[i].pos!=a[i+1].pos) show[q.top()]=true;
if (a[i].left)
q.push(a[i].num);
else
past[a[i].num]=true;
while (!q.empty()&&past[q.top()]) q.pop();
}
int ans=0;
for (int i=1;i<=n;i++)
if (show[i]) ans++;
printf("%d\n",ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator