SPOJ 2713. Can you answer these queries IV(GSS4 线段树)

来源:互联网 发布:淘宝 购物 受伤 索赔 编辑:程序博客网 时间:2024/06/06 01:39

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove 

题目:给出N个数,两种操作,更新操作为把区间的每一个数,都开方,查询操作为区间求和

http://www.spoj.pl/problems/GSS4/ 

这题的操作为开方操作,可以Lazy,可是基本没有什么效果,操作不能进行合并是一个大问题~

但是也正因为这是开方操作,也是突破点

一个64位整数,最多开方7次就变成1了,之后的开方操作也就没有效果了,这就是突破口

如果一个区间全是1了,那就没必要执行开方操作了,而最多只有7次,那就对区间的每一个暴力

加一点优化就是区间的和等于区间的个数,即区间全为1,就不更新,或者记录一个最值,最值为1不更新

#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<cmath>#include<vector>#include<queue>#include<algorithm>#include<set>#define inf (1ull<<63)-1#define N 100005#define maxn 100005#define Min(a,b) ((a)<(b)?(a):(b))#define Max(a,b) ((a)>(b)?(a):(b))#define pb(a) push_back(a)#define mem(a,b) memset(a,b,sizeof(a))#define eps 1e-9#define zero(a) fabs(a)<eps#define LL long long#define ULL unsigned long long#define lson (step<<1)#define rson (step<<1|1)#define MOD 1000000007#define mp(a,b) make_pair(a,b)using namespace std;struct Node{int left,right;LL sum;}L[N*5];int n,q;LL a[N];void Push_Up(int step){L[step].sum=L[lson].sum+L[rson].sum;}void Bulid(int step,int l,int r){L[step].left=l;L[step].right=r;if(l==r) {L[step].sum=a[l];return ;}int m=(l+r)/2;Bulid(lson,l,m);Bulid(rson,m+1,r);Push_Up(step);}void Update(int step,int l,int r){if(L[step].right-L[step].left+1==L[step].sum) return;if(L[step].left==L[step].right){L[step].sum=(LL)sqrt(L[step].sum+0.0);return;}int m=(L[step].left+L[step].right)/2;if(r<=m) Update(lson,l,r);else if(l>m) Update(rson,l,r);else{Update(lson,l,m);Update(rson,m+1,r);}Push_Up(step);}LL Query(int step,int l,int r){if(L[step].left==l&&L[step].right==r)return L[step].sum;int m=(L[step].left+L[step].right)/2;if(r<=m) return Query(lson,l,r);else if(l>m) return Query(rson,l,r);else return Query(lson,l,m)+Query(rson,m+1,r);}int main(){int cas=0;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++) scanf("%lld",&a[i]);Bulid(1,1,n);scanf("%d",&q);printf("Case #%d:\n",++cas);while(q--){int k,l,r;scanf("%d%d%d",&k,&l,&r);if(l>r) swap(l,r);if(k==0) Update(1,l,r);else printf("%lld\n",Query(1,l,r));}printf("\n");}return 0;}


原创粉丝点击