| ||||||||||
| 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 | |||||||||
小弟写的也不好,110ms。。。讲就着看吧。。In Reply To:Re:线段树一直是rte啊...最后只是用离散化过的...800+ms啊...哪位AC同学给我发份线段树的代码哈~ Posted by:hao2 at 2009-03-12 20:23:36 Source Code
Problem: 2528 User: Sona
Memory: 3428K Time: 110MS
Language: G++ Result: Accepted
Source Code
#include"iostream"
#include"algorithm"
using namespace std;
int sa[80010],a[80010],s[80010][2],n,d,f;
struct node
{
int beg,end,num,flag;
}tree[160010];
int search(int x)
{
int l=0,r=d-1,m;
while(1)
{
m=(l+r)/2;
if(a[m]==x)
return m;
else
if(a[m]>x)
r=m-1;
else
l=m+1;
}
}
void Inp(void)
{
int i;
d=1;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
sa[i*2]=s[i][0];
sa[i*2+1]=s[i][1];
}
sort(sa,sa+2*n);
a[0]=sa[0];
for(i=1;i<2*n;i++)
if (sa[i]!=sa[i-1])
if (sa[i]==sa[i-1]+1)
a[d++]=sa[i];
else
{
a[d++]=sa[i-1]+1;
a[d++]=sa[i];
}
for(i=0;i<n;i++)
{
s[i][0]=search(s[i][0]);
s[i][1]=search(s[i][1]);
}
memset(a,0,sizeof(a));
memset(tree,0,sizeof(tree));
}
void Create(int p,int beg,int end)
{
while(1){
tree[p].beg=beg;
tree[p].end=end;
tree[p].flag=tree[p].num=0;
if (beg==end)
return;
Create(p*2,beg,(beg+end)/2);
p=p*2+1;
beg=(beg+end)/2+1;
}
}
void Loop(int p,int beg,int end,int x)
{
if (tree[p].beg>end||tree[p].end<beg)
return;
if (tree[p].beg>=beg&&tree[p].end<=end)
{
tree[p].num=tree[p].flag=x;
return;
}
tree[p].num=-1;
if (tree[p].flag)
tree[p*2].num=tree[p*2].flag=tree[p*2+1].num=tree[p*2+1].flag=tree[p].flag;
tree[p].flag=0;
Loop(p*2,beg,end,x);
Loop(p*2+1,beg,end,x);
if (tree[p*2].num==tree[p*2+1].num)
tree[p].num=tree[p*2].num;
}
void Get(int p)
{
int i;
if (tree[p].num>0)
{
a[tree[p].num]=1;
return;
}
if (tree[p].beg==tree[p].end)
return;
Get(p*2);
Get(p*2+1);
}
void Cl(void)
{
int i,res=0;
Create(1,0,d-1);
for(i=0;i<n;i++)
Loop(1,s[i][0],s[i][1],i+1);
Get(1);
for(i=0;i<d;i++)
res+=a[i];
cout<<res<<endl;
}
int main()
{
int c,i;
scanf("%d",&c);
for(i=0;i<c;i++)
{
Inp();
Cl();
}
system("pause");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator