codevs1369 xth砍樹

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define R0(i,n) for(int i=0;i<n;++i)
#define R1(i,n) for(int i=1;i<=n;++i)
#define INF 0x7fffffff
using namespace std;
typedef long long ll;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int tr[800001],a[200005];
void build(int k,int x,int y){//建樹
	if(x==y){tr[k]=a[x];return;}
	int mid=(x+y)>>1;
	build(k<<1,x,mid);
	build(k<<1|1,mid+1,y);
	tr[k]=tr[k<<1]+tr[k<<1|1];
}
int work(int k,int x,int y,int aa,int b){//區間求和
    int mid,sum=0;
    if (aa<=x&&y<=b)return tr[k];
    mid=(x+y)>>1;
    if (aa<=mid) sum+=work(k<<1,x,mid,aa,b);
    if (b>mid)  sum+=work(k<<1|1,mid+1,y,aa,b);
    return sum;
}
void insert(int k,int x,int y,int aa){//單點修改,,就是砍了
    int mid;
    if (x==y&&x==aa){tr[k]=0;return;}
    mid=(x+y)>>1;
    if (aa<=mid) insert(k<<1,x,mid,aa);
    else insert(k<<1|1,mid+1,y,aa);
    tr[k]=tr[k<<1]+tr[k<<1|1];
}
int main(){
    int n=read(),m,i,j,l,r,sum;
    double ans;
    R1(i,n)a[i]=read();
    build(1,1,n);
    m=read();
    R1(i,m){
        l=read(),r=read();
        sum=work(1,1,n,l,r);
        insert(1,1,n,(l+r)/2);
        ans=sum*3.14;
        printf("%0.2f\n",ans);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章