标签:www. gis mst 数据 修改 inpu include pre discus
每次x=1时,每行一个整数,表示这次旅行的开心度
对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9
思路{
发现,一个数被开根号开最多6次就全变成1了.
那么用个数组记录一下开了几次,6次以上跳过.否则暴力修改.
}
#include<bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define db double
#define N 100010
using namespace std;
int n,m,a[N];
namespace Tree{
ll Sum[N*4];int cnt[N*4];
#define rs ((o<<1)|1)
#define ls (o<<1)
#define mid ((l+r)>>1)
void build(int o,int l,int r){
if(l==r){Sum[o]=a[l];return;}
build(ls,l,mid),build(rs,mid+1,r);
Sum[o]=Sum[rs]+Sum[ls];
}
void Modify(int o,int l,int r,int L,int R){
if(l>=L&&r<=R){
cnt[o]++;
if(l==r){Sum[o]=sqrt(Sum[o]);return;}
}
if(cnt[rs]<6&&mid<R)Modify(rs,mid+1,r,L,R);
if(cnt[ls]<6&&mid>=L)Modify(ls,l,mid,L,R);
Sum[o]=Sum[ls]+Sum[rs];
}
ll Query(int o,int l,int r,int L,int R){
if(l>=L&&r<=R)return Sum[o];
if(mid<L)return Query(rs,mid+1,r,L,R);
else if(mid>=R)return Query(ls,l,mid,L,R);
else return Query(rs,mid+1,r,L,R)+Query(ls,l,mid,L,R);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
Tree::build(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;++i){
int a,b,c;scanf("%d%d%d",&c,&a,&b);
if(c==1)cout<<Tree::Query(1,1,n,a,b)<<"\n";
else Tree::Modify(1,1,n,a,b);
}
return 0;
}
标签:www. gis mst 数据 修改 inpu include pre discus
原文地址:http://www.cnblogs.com/zzmmm/p/7512986.html