TLE 40分求助
查看原帖
TLE 40分求助
120438
Lacrymabre楼主2020/12/28 21:13
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define ll long long
using namespace std;

inline long long read()
{
    int f=1,s=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
    return s*f;
}

const int N=1e5+5;
ll x,y,z;
ll n,m,s[N],maxx[N<<2],sum[N<<2];
	
void build(ll k,ll l,ll r){
	if(l==r){
		sum[k]=maxx[k]=s[l];
		return;
	}
	ll mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}

void updata(ll k,ll l,ll r,ll x,ll y){
	if(l==r && l>=x && r<=y){
		if(maxx[k]!=1&&maxx[k]!=0) sum[k]=maxx[k]=sqrt(sum[k]);//如果当前区间内最大的是1那么必然全是1或0 所以就不开方了 
		return;
	}
	ll mid=l+r>>1;
	if(x<=mid) updata(k<<1,l,mid,x,y);
	if(mid+1<=y) updata(k<<1|1,mid+1,r,x,y);
	maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}

ll query(ll k,ll l,ll r,ll x,ll y){
	if(l==r && l>=x && r<=y) return sum[k];
	ll mid=l+r>>1,res=0;
	if(x<=mid) res+=query(k<<1,l,mid,x,y);
	if(mid+1<=y) res+=query(k<<1|1,mid+1,r,x,y);
	return res;
}

int main(){
	n=read();
	for(int i=1;i<=n;i++) s[i]=read();
	build(1,1,n);
	m=read();
	while(m-->0){
		z=read();x=read();y=read();
		if(x>=y) swap(x,y);
		if(z==1) printf("%d\n",query(1,1,n,x,y));
		else updata(1,1,n,x,y); 
	}
	return 0;
}

说句闲话,此题暴力修改是正解了吧,根号没有和并性

2020/12/28 21:13
加载中...