SP2713 GSS4 - Can you answer these queries IV(線段樹)
阿新 • • 發佈:2018-11-18
def for turn put spa main 是否 case 每次
傳送門
解題思路
大概就是一個數很少次數的開方會開到\(1\),而\(1\)開方還是\(1\),所以維護一個和,維護一個開方標記,維護一個區間是否全部為\(1/0\)的標記。然後每次修改時先看是否有全\(1\)或\(0\)的標記,有就不用理了,沒有就暴力開方。
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define int long long using namespace std; const int MAXN = 100005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch==‘-‘?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();} return f?x:-x; } int n,m,a[MAXN],sum[MAXN<<2],tag[MAXN<<2],lazy[MAXN<<2],cnt; void build(int x,int l,int r){ if(l==r) { a[l]=rd();sum[x]=a[l];lazy[x]=tag[x]=0; if(sum[x]==1 || sum[x]==0) lazy[x]=1; return ; } int mid=(l+r)>>1; build(x<<1,l,mid);build(x<<1|1,mid+1,r); sum[x]=sum[x<<1]+sum[x<<1|1]; lazy[x]=(lazy[x<<1]&lazy[x<<1|1]);tag[x]=0; } inline void pushdown(int x,int l,int r){ int mid=(l+r)>>1; if(!lazy[x<<1]){ tag[x<<1]+=tag[x];lazy[x<<1]=1;sum[x<<1]=0; for(int i=l;i<=mid;i++){ if(a[i]>1) lazy[x<<1]=0;sum[x<<1]+=a[i]; } } if(!lazy[x<<1|1]){ tag[x<<1|1]+=tag[x];lazy[x<<1|1]=0;sum[x<<1|1]=0; for(int i=mid+1;i<=r;i++){ if(a[i]>1) lazy[x<<1|1]=0;sum[x<<1|1]+=a[i]; } } tag[x]=0; } void update(int x,int l,int r,int L,int R){ if(lazy[x]) return; if(L<=l && r<=R){ tag[x]++;lazy[x]=1;sum[x]=0; for(int i=l;i<=r;i++) { if(a[i]>1) a[i]=sqrt(a[i]); if(a[i]>1) lazy[x]=0; sum[x]+=a[i]; } return ; } int mid=(l+r)>>1;if(tag[x]) pushdown(x,l,r); if(L<=mid) update(x<<1,l,mid,L,R); if(mid<R) update(x<<1|1,mid+1,r,L,R); sum[x]=sum[x<<1]+sum[x<<1|1]; lazy[x]|=(lazy[x<<1]&lazy[x<<1|1]); } int query(int x,int l,int r,int L,int R){ if(L<=l && r<=R) return sum[x]; int ret=0,mid=(l+r)>>1; if(tag[x]) pushdown(x,l,r); if(L<=mid) ret+=query(x<<1,l,mid,L,R); if(mid<R) ret+=query(x<<1|1,mid+1,r,L,R); return ret; } signed main(){ while(~scanf("%lld",&n)){cnt++; printf("Case #%lld:\n",cnt); build(1,1,n);m=rd();int op,x,y; while(m--){ op=rd(),x=rd(),y=rd();if(x>y) swap(x,y); if(!op) update(1,1,n,x,y); else printf("%lld\n",query(1,1,n,x,y)); } putchar(‘\n‘); } return 0; }
SP2713 GSS4 - Can you answer these queries IV(線段樹)