求助,本人萌新刚学OI
查看原帖
求助,本人萌新刚学OI
555381
zlttcl楼主2022/4/13 19:20
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register long long
ll n,m,tree[400010],qz,zz,zzz,num,k,x,y,z,l,r,maxn=-1,kk,ans[400010][3],li[400010],ri[400010];
short p[400010];
char a[400010];
inline ll read(){
   ll x=0,m=1;
   char ch=getchar();
   while(!isdigit(ch)){
	   if(ch=='-') m=-1;
	   ch=getchar();
	}
	while(isdigit(ch)){
	   x=x*10+ch-48;
	   ch=getchar();
	}
	return x*m;
}
inline void write(ll x){
	if(x<0){
	  putchar('-');
	  write(-x);
	  return;
	}
	if(x>=10) write(x/10);
	putchar(x%10+'0');
}
inline void work(ll x,ll y,ll s){
	if(s==zz+1) return;
	work(x*2,y,s+1);
	work(x*2+1,y,s+1);
	tree[x*2]+=y;
	tree[x*2+1]+=y;
}
inline void make(ll x,ll y){
	if(x==y) return;
	make(x,y/2);
	num+=tree[y];
}
signed main(){
    n=read(),m=read();
	cin>>a;
	for(rint sum=1;sum<=m;++sum){
		k=read();
		if(k==1){
		x=read(),y=read(),z=read();
			qz=1;
		for(rint i=y-1;i>=x-1;--i){
	ans[sum][1]+=(a[i]==48?0:1)*qz;
				qz*=2;
			}
			ans[sum][2]=z;
			p[sum]=1;
		}
		if(k==2){
			for(rint i=1;i<=2;++i){
				l=read();r=read();
				qz=1;
		for(rint j=r-1;j>=l-1;--j){
if(i==1) li[sum]+=(a[j]==48?0:1)*qz;
	else ri[sum]+=(a[j]==48?0:1)*qz;
					qz*=2;
				}
			}
			if(li[sum]>maxn)maxn=li[sum];
	if(ri[sum]>maxn) maxn=ri[sum];
			p[sum]=2;
		}
	}
	while(maxn>0){
		maxn-=pow(2,zz);
		++zz;
    }
	for(rint i=1;i<=m;++i){
		if(p[i]==1){
			zzz=1;
			kk=ans[i][1];
			while(kk>0){
				kk-=pow(2,zzz);
				++zzz;
			}
			tree[ans[i][1]]+=ans[i][2];
			work(ans[i][1],ans[i][2],zzz);
		}
		if(p[i]==2){
       if(li[i<ri[i])   num=tree[li[i]],make(li[i],ri[i]);
		else num=tree[ri[i]],make(ri[i],li[i]);
			write(num);
			putchar('\n');
			num=0; 
		}
	}
    return 0;
}

样例过了,但是1~3测试点不是MLE就是RE,怎么办QAQ(马蜂清奇不要在意)

2022/4/13 19:20
加载中...