卡常求助
查看原帖
卡常求助
567002
Zhangky2021楼主2022/12/6 21:15
#include<iostream>
using namespace std;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
void write(long long x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
int main(){
	int n, m;
	long long a[100005];
	int u, x, l, r;
	n=read();
	m=read();
	for(register int i=1;i<=n;i++){
		a[i]=read();
	}
	while(m--){
        u=read();
		if(u==1){
			l=read();
			r=read();
			x=read();
			if(x==1)continue;
			if(x==2){
				for(register int i=l;i<=r;i+=5){
					if(!(a[i]&1))a[i]>>=1;
					if(!(a[i+1]&1)&&i+1<=r)a[i+1]>>=1;
				    if(!(a[i+2]&1)&&i+2<=r)a[i+2]>>=1;
					if(!(a[i+3]&1)&&i+3<=r)a[i+3]>>=1;
					if(!(a[i+4]&1)&&i+4<=r)a[i+4]>>=1;
				}	
				continue;
			}
			if(x==4){
				for(register int i=l;i<=r;i++){
					if(!(a[i]&3))a[i]>>=2;
				}	
		    	continue;
			}
			for(register int i=l;i<=r;i+=7){
				if(a[i]%x==0)a[i]/=x;
				if(a[i+1]%x==0&&i+1<=r)a[i+1]/=x;
				if(a[i+2]%x==0&&i+2<=r)a[i+2]/=x;
				if(a[i+3]%x==0&&i+3<=r)a[i+3]/=x;	
				if(a[i+4]%x==0&&i+4<=r)a[i+4]/=x;
				if(a[i+5]%x==0&&i+5<=r)a[i+5]/=x;
				if(a[i+6]%x==0&&i+6<=r)a[i+6]/=x;
			}
		}
		if(u==2){
			l=read();
			r=read();
			long long s=0;
		    for(register int i=l;i<=r;i+=7){
				s+=a[i];
				if(i+1<=r)s+=a[i+1];
				if(i+2<=r)s+=a[i+2];
				if(i+3<=r)s+=a[i+3];
				if(i+4<=r)s+=a[i+4];
				if(i+5<=r)s+=a[i+5];
				if(i+6<=r)s+=a[i+6];
			}
			write(s);
			cout<<"\n";
		}
	}
}

还有那可以优化的啊?

2022/12/6 21:15
加载中...