BZOJ3038: 上帝造题的七分钟2
Posted Star_Feel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ3038: 上帝造题的七分钟2相关的知识,希望对你有一定的参考价值。
【传送门:BZOJ3038】
简要题意:
给出一个序列,对这些序列进行两种操作:
1 x y求出x到y的和
2 x y将x到y的数全部开方(向下取整)
题解:
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; struct node { int l,r,lc,rc;LL c; bool lazy; }tr[210000];int trlen; LL a[110000]; void bt(int l,int r) { trlen++;int now=trlen; tr[now].l=l;tr[now].r=r;tr[now].c=0; tr[now].lc=tr[now].rc=-1;tr[now].lazy=false; if(l==r) { tr[now].c=a[l]; if(tr[now].c==1||tr[now].c==0) tr[now].lazy=true; } else { int mid=(l+r)/2; tr[now].lc=trlen+1;bt(l,mid); tr[now].rc=trlen+1;bt(mid+1,r); tr[now].c=tr[tr[now].lc].c+tr[tr[now].rc].c; if(tr[tr[now].lc].lazy==true&&tr[tr[now].rc].lazy==true) tr[now].lazy=true; } } LL getsum(int now,int l,int r) { if(tr[now].l==l&&tr[now].r==r) return tr[now].c; int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2; if(r<=mid) return getsum(lc,l,r); else if(l>mid) return getsum(rc,l,r); else return getsum(lc,l,mid)+getsum(rc,mid+1,r); } void change(int now,int l,int r) { if(tr[now].lazy==true) return ; if(tr[now].l==tr[now].r) { tr[now].c=LL(sqrt(tr[now].c)); if(tr[now].c==1||tr[now].c==0) tr[now].lazy=true; return ; } int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2; if(r<=mid) change(lc,l,r); else if(l>mid) change(rc,l,r); else { change(lc,l,mid); change(rc,mid+1,r); } tr[now].c=tr[lc].c+tr[rc].c; if(tr[lc].lazy==true&&tr[rc].lazy==true) tr[now].lazy=true; } int main() { int n,m; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); trlen=0;bt(1,n); scanf("%d",&m); for(int i=1;i<=m;i++) { int t,x,y; scanf("%d%d%d",&t,&x,&y); if(x>y) swap(x,y); if(t==1) printf("%lld\\n",getsum(1,x,y)); else change(1,x,y); } return 0; }
以上是关于BZOJ3038: 上帝造题的七分钟2的主要内容,如果未能解决你的问题,请参考以下文章