10分求条
查看原帖
10分求条
1375749
Green_Leaves楼主2024/7/8 17:25
#include<bits/stdc++.h>
#define ll long long
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
using namespace std;
int tree[250005<<3][10],tag[250005<<3],s[250005];
#define rotate(ii) {\
	if(tag[ii]){\
		int jcq=tree[ii][9];\
		tree[ii][9]=tree[ii][8];\
		tree[ii][8]=tree[ii][7];\
		tree[ii][7]=tree[ii][6];\
		tree[ii][6]=tree[ii][5];\
		tree[ii][5]=tree[ii][4];\
		tree[ii][4]=tree[ii][3];\
		tree[ii][3]=tree[ii][2];\
		tree[ii][2]=tree[ii][1];\
		tree[ii][1]=tree[ii][0];\
		tree[ii][0]=jcq;\
	}\
}
void push_down(int i){
	int jcq;
	tag[ls(i)]+=tag[i];
	tag[rs(i)]+=tag[i];
	if(tag[ls(i)]>=10)tag[ls(i)]-=10;
	if(tag[rs(i)]>=10)tag[rs(i)]-=10;
	
	while(tag[i]){
		tag[i]--;
		rotate(ls(i));
		rotate(rs(i));
	}
	
}
#define updata(ii) {\
	tree[ii][0]=tree[ls(ii)][0]+tree[rs(ii)][0];\
	tree[ii][1]=tree[ls(ii)][1]+tree[rs(ii)][1];\
	tree[ii][2]=tree[ls(ii)][2]+tree[rs(ii)][2];\
	tree[ii][3]=tree[ls(ii)][3]+tree[rs(ii)][3];\
	tree[ii][4]=tree[ls(ii)][4]+tree[rs(ii)][4];\
	tree[ii][5]=tree[ls(ii)][5]+tree[rs(ii)][5];\
	tree[ii][6]=tree[ls(ii)][6]+tree[rs(ii)][6];\
	tree[ii][7]=tree[ls(ii)][7]+tree[rs(ii)][7];\
	tree[ii][8]=tree[ls(ii)][8]+tree[rs(ii)][8];\
	tree[ii][9]=tree[ls(ii)][9]+tree[rs(ii)][9];\
}
void build(int l,int r,int i){
	if(l==r){
		tree[i][s[l]]=1;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls(i));
	build(mid+1,r,rs(i));
	updata(i);
	//cout<<l<<' '<<r<<' '<<tree[ls(i)][1]+tree[rs(i)][1]<<' '<<tree[ls(i)][2]+tree[rs(i)][2]<<endl;
}
void sett(int l,int r,int i,int tl,int tr){
	push_down(i);
	if(tl>=l&&tr<=r){
		tag[i]++;
		if(tag[i]>=10)tag[i]-=10;
		rotate(i);
		return;
	}
	int mid=(tl+tr)>>1;
	if(l<=mid)sett(l,r,ls(i),tl,mid);
	if(r>mid)sett(l,r,rs(i),mid+1,tr);
	updata(i); 
}
int gett(int l,int r,int i,int tl,int tr){
	push_down(i);
	if(l<=tl&&tr<=r){
		return tree[i][1]+(tree[i][2]<<1)+(tree[i][3]<<1)+tree[i][3]+(tree[i][4]<<2)+(tree[i][5]<<2)+tree[i][5]+(tree[i][6]<<2)+(tree[i][6]<<1)+(tree[i][7]<<3)-tree[i][7]+(tree[i][8]<<3)+(tree[i][9]<<3)+tree[i][9];
	}
	int mid=(tl+tr)>>1,anss=0;
	if(l<=mid)anss+=gett(l,r,ls(i),tl,mid);
	if(r>mid)anss+=gett(l,r,rs(i),mid+1,tr);
	return anss;
}
int main(){
	ios::sync_with_stdio(0);
	int n,m;
	cin>>n>>m;
	char c;
	for(int i=1;i<=n;i++){
		cin>>c;
		s[i]=c^'0';
	}
	build(1,n,1);
	int l,r;
	while(m--){
		cin>>l>>r;
		cout<<gett(l,r,1,1,n)<<'\n';
		sett(l,r,1,1,n);
	}
}

rt,只过了第一个点

2024/7/8 17:25
加载中...