标签:sub and hang second nts bat shu math java
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)
Total Submission(s): 15314 Accepted Submission(s): 3590
//因为题目中所有和不超过2^63,所以每个数开方次数不超过7,这样在更新[b,c]时 //如果区间内的所有数都是1就不必更新了,否则挨个更新叶子。 #include<iostream> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; const int maxn=100005; ll sum[maxn*4+10]; void Pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void Build(int l,int r,int rt) { if(l==r){ scanf("%lld",&sum[rt]); return; } int m=(l+r)>>1; Build(l,m,rt<<1); Build(m+1,r,rt<<1|1); Pushup(rt); } void Update(int ql,int qr,int l,int r,int rt) { if(l==r){ sum[rt]=sqrt(sum[rt]); return; } if(ql<=l&&qr>=r&&sum[rt]==r-l+1) return; int m=(l+r)>>1; if(ql<=m) Update(ql,qr,l,m,rt<<1); if(qr>m) Update(ql,qr,m+1,r,rt<<1|1); Pushup(rt); } ll Query(int ql,int qr,int l,int r,int rt) { if(ql<=l&&qr>=r) return sum[rt]; int m=(l+r)>>1; ll s=0; if(ql<=m) s+=Query(ql,qr,l,m,rt<<1); if(qr>m) s+=Query(ql,qr,m+1,r,rt<<1|1); return s; } int main() { int n,m,cas=0; while(scanf("%d",&n)==1){ Build(1,n,1); scanf("%d",&m); int a,b,c; printf("Case #%d:\n",++cas); while(m--){ scanf("%d%d%d",&a,&b,&c); int bb=min(b,c),cc=max(b,c); if(a) printf("%lld\n",Query(bb,cc,1,n,1)); else Update(bb,cc,1,n,1); } printf("\n"); } return 0; }
标签:sub and hang second nts bat shu math java
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6606440.html