您的位置:首页 > 其它

【BZOJ3211】花神游历各国(线段树)

2018-02-23 11:51 375 查看

题面

BZOJ

题解

线段树傻逼题

对于开根操作

直接暴力进行

维护一个区间最大值,如果区间最大值<=1就不用再算了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 100100
#define ll long long
#define lson (now<<1)
#define rson (now<<1|1)
inline ll read()
{
ll x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m;
struct Node{ll s;ll mx;}t[MAX<<2];
void Build(int now,int l,int r)
{
if(l==r){t[now].mx=t[now].s=read();return;}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
t[now].s=t[lson].s+t[rson].s;
t[now].mx=max(t[lson].mx,t[rson].mx);
}
void Modify(int now,int l,int r,int L,int R)
{
if(t[now].mx<=1)return;
if(l==r){t[now].mx=t[now].s=sqrt(t[now].mx);return;}
int mid=(l+r)>>1;
if(L<=mid)Modify(lson,l,mid,L,R);
if(R>mid)Modify(rson,mid+1,r,L,R);
t[now].s=t[lson].s+t[rson].s;
t[now].mx=max(t[lson].mx,t[rson].mx);
}
ll Query(int now,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return t[now].s;
ll ret=0;
int mid=(l+r)>>1;
if(L<=mid)ret+=Query(lson,l,mid,L,R);
if(R>mid)ret+=Query(rson,mid+1,r,L,R);
return ret;
}
int main()
{
n=read();
Build(1,1,n);
m=read();
while(m--)
{
int opt=read(),l=read(),r=read();
if(r<l)swap(l,r);
if(opt==1)printf("%lld\n",Query(1,1,n,l,r));
else Modify(1,1,n,l,r);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: