SP2713 GSS4 - Can you answer these queries IV
阿新 • • 發佈:2018-09-05
() 輸出 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