萌新刚学OI,求助MLE
查看原帖
萌新刚学OI,求助MLE
101742
汤汤tongtongTOT楼主2021/8/1 21:40
// Problem: P6587 超超的序列 加强
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6587
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while('0'>ch||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while('0'<=ch&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
const int N=2e5*20+5;
int n,m,op,ans,ch[N][2],cnt=1,tag[N],lazy[N],x,y,z;
int sum[N];
void dfs(int x){
	if(ch[x][0]) dfs(ch[x][0]);
	if(ch[x][1]) dfs(ch[x][1]);
	sum[x]+=sum[ch[x][0]]+sum[ch[x][1]];
	tag[x]+=tag[ch[x][0]]+tag[ch[x][1]];
}
void pd(int x){
	if(!x) {
		lazy[x]=0;
		return;	
	}
	int k=ch[x][0];
	if(lazy[x]){
		if(k) lazy[k]+=lazy[x];
		if(k) sum[k]+=(lazy[x]*tag[k]);
		k=ch[x][1];
		if(k) lazy[k]+=lazy[x];
		if(k) sum[k]+=(lazy[x]*tag[k]);
		lazy[x]=0;
	}
}
void dfs(int tmp,int x,int k,int z){
	if(!tmp){
		lazy[x]+=z;
		sum[x]+=(tag[x]*z);
		return;
	}
	pd(x);
	// if(a[x]!=-1) a[x]+=z;
	dfs(tmp-1,ch[x][k&1],k>>1,z);
	sum[x]=sum[ch[x][0]]+sum[ch[x][1]];
}
int dfs(int tmp,int x,int k){
	if(!tmp){
		return sum[x];
	}
	pd(x);
	// int tmpp=(a[x]!=-1)?a[x]:0;
	return dfs(tmp-1,ch[x][k&1],k>>1);
}
signed main() {
	// memset(a,-1,sizeof(a));
	n=read();m=read();
	for(int i=1;i<=n;i++){
		int tmp=i,u=1;
		while(tmp){
			if(!ch[u][tmp&1]) ch[u][tmp&1]=++cnt;
			u=ch[u][tmp&1];
			tmp>>=1;
		}
		sum[u]+=read();tag[u]++;
	}
	dfs(1);
	for(int i=1;i<=m;i++){
		op=read();
		op=(op+ans)%2+1;
		if(op==1){
			x=read();y=read();z=read();
			y=y%(1LL<<x);
			dfs(x,1,y,z);
		}
		else{
			x=read();y=read();
			y=y%(1LL<<x);
			ans=dfs(x,1,y);
			cout<<ans<<"\n";
		}
	}
}

能不能帮忙看看哪里MLE了啊。。

2021/8/1 21:40
加载中...