| ||||||||||
| 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 | |||||||||
Re:相信很多人都过不了这组数据吧!!!In Reply To:相信很多人都过不了这组数据吧!!! Posted by:lingyuntan at 2010-10-19 17:01:22 离散化没问题,向我的程序你提供的数据,克的出正确答案,虽然wa,只要正确的利用线段树就可以了,大家可以看我的程序
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=20000;
int p[maxn+10][2],v[maxn*2*3];
int n;
int ql,qr;
struct node2
{
int num;
int data;
};
node2 order[maxn*2+10];
bool cmp(node2 a,node2 b)
{
return a.data<b.data;
}
int update(int node,int l,int r,int x)
{
int flag;
if(l>=ql&&r<=qr)
{
if(v[node]) return 1;
else
{
v[node]=x;
return 0;
}
}
else
{
int m=l+(r-l)/2;
if(v[node])
{
flag=1;
return flag;
}
if(ql<=m&&qr>m) flag=update(node*2,l,m,x)&update(node*2+1,m+1,r,x);
else if(ql<=m) flag=update(node*2,l,m,x);
else flag=update(node*2+1,m+1,r,x);
}
return flag;
}
int main()
{
int c;
cin>>c;
while(c--)
{
scanf("%d",&n);
int i,j;
int a,b;
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
order[i*2].data=a;order[i*2].num=-(i+1);
order[i*2+1].data=b;order[i*2+1].num=i+1;
}
sort(order,order+2*n,cmp);
int tem=0,f=0;;
for(i=0;i<2*n;i++)//离散化
{
if(order[i].data!=tem)
{
tem=order[i].data;
f++;
}
if(order[i].num<0) p[-order[i].num][0]=f;
else p[order[i].num][1]=f;
}
memset(v,0,sizeof(v));
int amount=0;
for(i=n;i>=1;i--)//从后往前插入
{
ql=p[i][0];qr=p[i][1];
if(!update(1,1,maxn,i)) amount++;
}
printf("%d\n",amount);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator