P4145 上帝造題的七分鐘2 / 花神遊歷各國
阿新 • • 發佈:2019-03-18
scan 花神 個數 log main lld clas for str
思路
每個數不會被開方超過log次,對每個數暴力開方即可
代碼
#include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #define int long long using namespace std; struct Node{ int max,sum; }Seg[100100<<2]; int a[100100],n,m; void pushup(int o){ Seg[o].sum=Seg[o<<1].sum+Seg[o<<1|1].sum; Seg[o].max=max(Seg[o<<1].max,Seg[o<<1|1].max); } void build(int l,int r,int o){ if(l==r){ Seg[o].sum=Seg[o].max=a[l]; return; } int mid=(l+r)>>1; build(l,mid,o<<1); build(mid+1,r,o<<1|1); pushup(o); } void modi(int L,int R,int l,int r,int o){ if(Seg[o].max<=1) return; if(l==r){ Seg[o].max=Seg[o].sum=sqrt(Seg[o].sum); return; } int mid=(l+r)>>1; if(L<=mid) modi(L,R,l,mid,o<<1); if(R>mid) modi(L,R,mid+1,r,o<<1|1); pushup(o); } int query(int L,int R,int l,int r,int o){ if(L<=l&&r<=R){ return Seg[o].sum; } int mid=(l+r)>>1,ans=0; if(L<=mid) ans+=query(L,R,l,mid,o<<1); if(R>mid) ans+=query(L,R,mid+1,r,o<<1|1); return ans; } signed main(){ scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,n,1); scanf("%lld",&m); for(int i=1;i<=m;i++){ int opt,l,r; scanf("%lld %lld %lld",&opt,&l,&r); if(l>r) swap(l,r); if(opt==0) modi(l,r,1,n,1); else printf("%lld\n",query(l,r,1,n,1)); } return 0; }
P4145 上帝造題的七分鐘2 / 花神遊歷各國