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;
}
#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;
}
相关文章推荐
- HDU 4027 Can you answer these queries? (线段树)
- HDU 4027 Can you answer these queries? 线段树,区间修改
- HDU 4027 线段树 Can you answer these queries?
- hdu 4027 Can you answer these queries? 线段树 懒惰标记 单点更新妙用
- hdu 4027 Can you answer these queries? 线段树区间修改区间查询
- HDU-4027 Can you answer these queries? (线段树 区间修改 区间查询)(The 36th ACM/ICPC Asia Regional Shanghai)
- HDU 4027 Can you answer these queries? (线段树:区间set变形,区间求和)
- HDU 4027 Can you answer these queries?(线段树、查询区间和及修改区间数为数的平方根)
- Can you answer these queries? HDU - 4027 线段树单点更新
- Hdu 4027 Can you answer these queries?(线段树)
- HDU 4027 Can you answer these queries?(线段树)
- hdu 4027 Can you answer these queries? -线段树
- hdu 4027 Can you answer these queries? 求区间N次根的和 线段树
- HDU 4027 Can you answer these queries?(线段树区间更新)
- HDU 4027 Can you answer these queries?(线段树求区间和)
- hdu 4027 Can you answer these queries?(线段树)
- HDU - 4027 Can you answer these queries? (线段树 区间更新区间查询)
- HDU 4027 Can you answer these queries?(线段树单点更新)
- HDU 4027 Can you answer these queries? (线段树变着花样让你区间更新)
- HDU 4027 Can you answer these queries (有意思的线段树)