| ||||||||||
| 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 | |||||||||
下面是挂的代码,用线段树+离散化,RUNTIme error求解~~In Reply To:首先庆祝用漂浮法模拟过了,还很快,188MS~~~~~然后悲剧用离散化+线段树挂了,求解~ Posted by:ccyjava at 2010-11-20 11:50:37 #include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "malloc.h"
int cmp(const void *a,const void *b){
return (*(int *)a)-(*(int*)b);
}
struct {
int l,r,c;
}st[30001];//线段树的节点
int col[10001];//颜色
int p[20001];//离散化后的值
int m;//离散化后的数目
int x[10001];//左端点
int y[10001];//右端点
int *hash;//原来的值到离散的值的映射
int cc;//结果
void build(int a,int b,int ind){
st[ind].l=a;
st[ind].r=b;
st[ind].c=0;
if(a==b)
return;
int mid=(a+b)/2;
build(a,mid,ind*2);
build(mid+1,b,ind*2+1);
}
void update(int a,int b,int ind,int k){
if((a<=st[ind].l&&st[ind].r<=b)){
st[ind].c=k;
return;
}
if(st[ind].c>0){
st[ind*2].c=st[ind].c;
st[ind*2+1].c=st[ind].c;
}
st[ind].c=-1;
int mid=(st[ind].l+st[ind].r)/2;
if(a<=mid)
update(a,b,ind*2,k);
if(b>mid)
update(a,b,ind*2+1,k);
}
void count(int ind){
if(st[ind].c>0){
if(col[st[ind].c]==0)
cc++;
col[st[ind].c]=1;
return;
}
if(st[ind].c==0)
return;
count(ind*2);
count(ind*2+1);
return;
}
int getindex(int a){
int from,to,mid;
from=0;
to=m-1;
while(from<=to){
mid=(from+to)/2;
if(p[mid]==a)
return mid;
if(p[mid]<a){
from=mid+1;
}
else{
to=mid-1;
}
}
printf("error\n");
return -1;
}
int getindex2(int a){
if(hash[a]>=0&&hash[a]<m)
return hash[a];
printf("error");
}
void inithash(){
int i;
for(i=0;i<m;i++){
hash[p[i]]=i;
}
}
int main(){
int c;
int n;
scanf("%d",&c);
hash=(int*)malloc(sizeof(int)*20000001);
while(c--){
int i;
cc=0;
memset(col,0,sizeof(col));
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d",&x[i],&y[i]);
p[2*i]=x[i];
p[2*i+1]=y[i];
}
//=================离散化=========================
qsort(p,2*n,sizeof(int),cmp);
for(i=0,m=0;i<2*n;i++){
if(i==0||p[i]!=p[i-1]){
p[m++]=p[i];
}
}
inithash();
//===============用线段树处理====================
build(1,m,1);
for(i=0;i<n;i++){
update(getindex(x[i])+1,getindex(y[i])+1,1,i+1);
}
count(1);
printf("%d\n",cc);
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator