bzoj 3211: 花神游历各国 (线段树)

来源:互联网 发布:游族网络客服工作 编辑:程序博客网 时间:2024/04/28 14:32

3211: 花神游历各国

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 2778  Solved: 1039
[Submit][Status][Discuss]

Description

Input

Output

每次x=1时,每行一个整数,表示这次旅行的开心度

Sample Input

4

1 100 5 5

5

1 1 2

2 1 2

1 1 2

2 2 3

1 1 4

Sample Output

101

11

11

HINT

对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9


Source

SPOJ2713 gss4 数据已加强

[Submit][Status][Discuss]

题解:线段树

同上帝造题的7分钟2

#include<iostream>  #include<cstdio>  #include<cstring>  #include<cmath>  #define N 100003  #define ll long long  using namespace std;  ll n,m;  ll a[N],tr[4*N],delta[4*N];  void update(ll x)  {   tr[x]=tr[x<<1]+tr[x<<1|1];   delta[x]=(delta[x<<1]&&delta[x<<1|1]);  }  void build(ll now,ll l,ll r)  {   if (l==r)   {    tr[now]=a[l];    return ;   }   ll mid=(l+r)/2;   build(now<<1,l,mid);   build(now<<1|1,mid+1,r);   update(now);  }  ll qjsum(ll now,ll l,ll r,ll lx,ll rr)  {   if (l>=lx&&r<=rr)   {    return tr[now];   }   ll mid=(l+r)/2;   ll sum=0;   if (lx<=mid)    sum+=qjsum(now<<1,l,mid,lx,rr);   if (rr>mid)    sum+=qjsum(now<<1|1,mid+1,r,lx,rr);   return sum;  }  void change(ll now,ll l,ll r,ll lx,ll rr)  {    if (delta[now])  return;    if (l==r)     {       tr[now]=(long long)sqrt(tr[now]);       a[l]=(long long )sqrt(a[l]);       if (tr[now]==0||tr[now]==1)  delta[now]=1;       return ;     }    ll mid=(l+r)/2;    if (lx<=mid) change(now<<1,l,mid,lx,rr);    if (rr>mid) change(now<<1|1,mid+1,r,lx,rr);    update(now);  }  int main()  {   scanf("%lld",&n);   for (ll i=1;i<=n;i++)  scanf("%lld",&a[i]);   build(1,1,n);   scanf("%lld",&m);   for (ll i=1;i<=m;i++)    {     ll op,x,y; scanf("%lld%lld%lld",&op,&x,&y);     if (x>y) swap(x,y);     if (op==1)      printf("%lld\n",qjsum(1,1,n,x,y));     else      change(1,1,n,x,y);    }  }  



0 0
原创粉丝点击