您的位置:首页 > 产品设计 > UI/UE

hdu 4027(线段树)Can you answer these queries?

2013-04-22 14:18 288 查看
这题,要判断一下每个区间是否已经被开完平方。否则会TLE

#include <iostream>
#include<cmath>
using namespace std;
__int64 sgTree[111111<<2];
__int64 s;
int cov[100005<<2]; //判断这个区间的所有值是否已除尽。。。

void build(int l,int r,int rt)
{
cov[rt]=0;
if(l==r)
{
scanf("%I64d",&sgTree[rt]);
return;
}
int mid=(l+r)/2;
build(l,mid,rt*2);
build(mid+1,r,rt*2+1);
sgTree[rt]=sgTree[rt*2]+sgTree[rt*2+1];
}

void update(int l,int r,int rt,int tl,int tr)
{
if(cov[rt]) return; //少了这个判断,会TLE
if(l==r)
{
sgTree[rt]=(__int64)sqrt(sgTree[rt]*1.0);
if(sgTree[rt]==1) cov[rt]=1; //判断是否已除尽
return;
}
int mid=(l+r)/2;
if(tr<=mid) update(l,mid,rt*2,tl,tr);
else if(tl>mid) update(mid+1,r,rt*2+1,tl,tr);
else
{
update(l,mid,rt*2,tl,mid);
update(mid+1,r,rt*2+1,mid+1,tr);
}
sgTree[rt]=sgTree[rt*2]+sgTree[rt*2+1];
cov[rt]=cov[rt*2]&&cov[rt*2+1]; //同理,只要这个区间都被开完平方,就为真
}

void query(int l,int r,int rt,int tl,int tr)
{
if(l==tl&&r==tr)
{
s+=sgTree[rt];
return;
}

int mid=(l+r)/2;
if(tr<=mid) query(l,mid,rt*2,tl,tr);
else if(tl>mid) query(mid+1,r,rt*2+1,tl,tr);
else
{
query(l,mid,rt*2,tl,mid);
query(mid+1,r,rt*2+1,mid+1,tr);
}
}

int main()
{
// freopen("in.txt","r",stdin);
int n;
int t=1;
while(scanf("%d",&n)==1)
{
build(1,n,1); //建树
int m;
scanf("%d",&m);
printf("Case #%d:\n",t++);
while(m--)
{
__int64 a,b,c;
scanf("%I64d %I64d %I64d",&a,&b,&c);
if(b>c){__int64 tmp=b; b=c; c=tmp;}
if(a)
{
s=0;
query(1,n,1,b,c); //查询
printf("%I64d\n",s);
}
else
update(1,n,1,b,c); //更新
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu4027线段树