记录编号 58232 评测结果 AAAAAAAAAA
题目名称 最终得分 100
用户昵称 Gravatardigital-T 是否通过 通过
代码语言 C++ 运行时间 2.815 s
提交时间 2013-04-18 18:24:57 内存使用 7.83 MiB
显示代码纯文本
#include<fstream>
#include<iomanip>
using namespace std;
ifstream fi("treed.in");
ofstream fo("treed.out");
class bb
{
public:
	int l,r,Lchild,Rchild,s;//左界右界左儿子右儿子区间高度总值
}tree[400000];
int n,m,tot,d[200000];
double ans;
void maketree(int root,int x,int y)
{
	tree[root].l=x;
	tree[root].r=y;
	if(x!=y)//非叶子节点
	{
		int mid=(x+y)/2;
		tot++;
		tree[root].Lchild=tot;
		maketree(tot,x,mid);
		tot++;
		tree[root].Rchild=tot;
		maketree(tot,mid+1,y);
		tree[root].s=tree[tree[root].Lchild].s+tree[tree[root].Rchild].s;
	}
	else//叶子节点
	{
		tree[root].s=d[x];
		tree[root].Lchild=-1;
		tree[root].Rchild=-1;
	}
}
int quest(int root,int x,int y)//查询[x,y]
{
	if(root==-1)return 0;
	if(y<tree[root].l||tree[root].r<x)return 0;//不相交区间
	if(tree[root].Lchild==-1)return tree[root].s;//叶子节点
	if(x<=tree[root].l&&tree[root].r<=y)return tree[root].s;//全覆盖区间
	//相交区间
	int sum=0;
	if(x<=tree[tree[root].Lchild].r)//左区间
		sum+=quest(tree[root].Lchild,x,y);
	if(tree[tree[root].Rchild].l<=y)//右区间
		sum+=quest(tree[root].Rchild,x,y);
	return sum;
}
void cutdown(int root,int x)
{
	if(tree[root].l>x||tree[root].r<x)return;//不相交区间
	if(tree[root].Lchild==-1)//叶子节点
	{
		tree[root].s=0;
		d[x]=0;
		return;
	}
	tree[root].s-=d[x];
	cutdown(tree[root].Lchild,x);
	cutdown(tree[root].Rchild,x);
}
int main()
{
	fi>>n;
	for(int i=1;i<=n;i++)fi>>d[i];
	tot=0;
	maketree(0,1,n);
	fi>>m;
	/*for(int i=0;i<n*2;i++)
		fo<<tree[i].l<<' '<<tree[i].r<<' '<<tree[i].s<<endl;*/
	int a,b;
	for(int i=1;i<=m;i++)
	{	
		fi>>a>>b;
		ans=quest(0,a,b);//fo<<a<<' '<<b<<' '<<ans<<endl;
		ans*=3.14;
		fo<<setprecision(2)<<setiosflags(ios::fixed)<<ans<<endl;
		cutdown(0,(a+b)/2);
	}
	return 0;
}