标签:线段树
10 1 2 3 4 5 6 7 8 9 10 5 0 1 10 1 1 10 1 1 5 0 5 8 1 4 8
Case #1: 19 7 6这道题看了别人的题解做出来了,感觉2^63次是来吓唬人的,其实开7次根号就是1了,然后就不变了。这里一个一个更新肯定会超时的,所以要利用成段更新,但这里又有一个问题,每个数字变化后他们变化的值都不同,不是普通的减或乘,所以比较特殊。这里我先判断是不是区间里的数都是1,如果都是1就都不用更新,因为1的平方根还是1,那么怎么判断呢,这里用b[i].sum==b[i].r-b[i].l+1来判断。如果说区间里有大于1的数,那么都要更新到叶子节点(这里有个剪枝,就是每次更新完后记录a[i]的值,如果下次更新,a[i]已经是1了就可以直接跳过去不更新)。#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define maxn 1000006 __int64 a[maxn+100],sum; struct node{ int l,r; __int64 sum; }b[16*maxn]; void build(int l,int r,int i) { int mid; b[i].l=l;b[i].r=r; if(l==r){ b[i].sum=a[l];return; } mid=(l+r)/2; build(l,mid,i*2); build(mid+1,r,i*2+1); b[i].sum=b[i*2].sum+b[i*2+1].sum; } void update1(int id,int i) { int mid; if(b[i].l==b[i].r){ b[i].sum=a[b[i].l]=(int)(sqrt(1.0*a[b[i].l])); return; } mid=(b[i].l+b[i].r)/2; if(id>mid)update1(id,i*2+1); else update1(id,i*2); b[i].sum=b[i*2].sum+b[i*2+1].sum; } void update(int l,int r,int i) { int mid,j; if(b[i].l==l && b[i].r==r){ if(b[i].sum==b[i].r-b[i].l+1)return; for(j=b[i].l;j<=b[i].r;j++){ if(a[j]==1)continue; update1(j,1); } return; } mid=(b[i].l+b[i].r)/2; if(r<=mid)update(l,r,i*2); else if(l>mid)update(l,r,i*2+1); else { update(l,mid,i*2); update(mid+1,r,i*2+1); } } void question(int l,int r,int i) { int mid; if(b[i].l==l && b[i].r==r){ sum+=b[i].sum;return; } mid=(b[i].l+b[i].r)/2; if(r<=mid)question(l,r,i*2); else if(l>mid)question(l,r,i*2+1); else { question(l,mid,i*2); question(mid+1,r,i*2+1); } } int main() { int n,m,i,j,d,c,e,num1=0,temp; while(scanf("%d",&n)!=EOF) { num1++; printf("Case #%d:\n",num1); for(i=1;i<=n;i++){ scanf("%I64d",&a[i]); } build(1,n,1); scanf("%d",&m); for(i=1;i<=m;i++){ scanf("%d%d%d",&c,&d,&e); if(d>e){ temp=d;d=e;e=temp; } if(c==0)update(d,e,1); else{ sum=0; question(d,e,1); printf("%I64d\n",sum); } } printf("\n"); } return 0; }
hdu4027 Can you answer these queries?
标签:线段树
原文地址:http://blog.csdn.net/kirito_acmer/article/details/46239925