1. 程式人生 > >SP2713 GSS4 - Can you answer these queries IV

SP2713 GSS4 - Can you answer these queries IV

() 輸出 line 尋找 ace != == ios 格式

傳送門


\(ZHX\; TQL\) Orz


這道題目我們可以用線段樹維護……

可能有\(dalao\)會問:“線段樹怎麽維護區間開平方?”

而這道題的精髓就在於,它要我們維護的操作是開平方+下取整。也就是說經過一定的次數,要開平方的數會慢慢縮小為"\(1\)",這個次數是很小的,而\(\sqrt 1=1\)

所以在修改時,我們可以先查詢這個區間是否全是"1",如果是,那我們就不管它,再去尋找其他的區間進行修改,如果這個區間裏有其他數,我們就將這些遞歸尋找這些數,然後單點修改進行開平方操作。

\(\tt{P.S.}\) 要註意這個題目的輸出格式

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define mid ((l+r)>>1)
#define LL long long
#define ls p<<1
#define rs p<<1|1
using namespace std;
LL tree[100010<<4],a[100010];
inline void up(int p){
    tree[p]=tree[ls]+tree[rs];
}
void build(int l,int r,int p){
    if(l==r){
        tree[p]=a[l]; return ;
    }
    build(l,mid,ls); build(mid+1,r,rs);
    up(p);
}
void update(int l,int r,int p,int nl,int nr){
    if(l>=nl&&r<=nr){
        if(tree[p]<=r-l+1) return ;
        else{
            if(l==r){
                tree[p]=(int)sqrt((double)tree[p]);
                return ;
            }
        }
    }
    up(p);
    if(nl<=mid) update(l,mid,ls,nl,nr);
    up(p);
    if(nr>mid) update(mid+1,r,rs,nl,nr);
    up(p);
}
LL query(int l,int r,int p,int nl,int nr){
    LL ans=0;
    if(l>=nl&&r<=nr) return tree[p];
    if(nl<=mid) ans+=query(l,mid,ls,nl,nr);
    if(nr>mid) ans+=query(mid+1,r,rs,nl,nr);
    return ans;
}
LL read(){
    LL k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=k*10+c-48;
    return k*f;
}
int main(){
    //freopen("hh.in","r",stdin);
    //freopen("hh.out","w",stdout);
    int n,tot=0;
    while(scanf("%d\n",&n)!=EOF){
        printf("Case #%d:\n",++tot);
        for(int i=1;i<=n;i++) a[i]=read();
        build(1,n,1);
        int m=read();
        for(int i=1;i<=m;i++){
            int k=read(),l=read(),r=read();
            if(l>r) swap(l,r);
            if(k==0) update(1,n,1,l,r);
            else printf("%lld\n",query(1,n,1,l,r));
        }
        printf("\n");   
    }
    return 0;
}

SP2713 GSS4 - Can you answer these queries IV