求和部分写挂了,但是找不到错误……(循环展开)
查看原帖
求和部分写挂了,但是找不到错误……(循环展开)
804607
rainygame楼主2023/5/1 10:23
#include <stdio.h>
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#define f_inline inline __attribute__((always_inline))
#define reg register

const int MAXSIZE = 1 << 20;
char buf[MAXSIZE], *p1, *p2;
#define gc()                                                               \
  (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) \
       ? EOF                                                               \
       : *p1++)

char pbuf[1<<21];
int p, p3(-1);

void flush() {
    fwrite(pbuf, 1, p3+1, stdout);
	p3 = -1;
}

f_inline int uread(){
	reg int x(0);
	reg char ch;
	while ((ch = gc()) < 48);
	do{
		x = (x << 1) + (x << 3) + (ch ^ 48);
	}while ((ch = gc()) > 47);
	return x;
}

void uprint(reg const long long x){
	reg const long long tmp(x/10);
	if (tmp) uprint(tmp);
	pbuf[++p3] = (x-(tmp<<1)-(tmp<<3)+'0');
}

int a[100000];

int main(){
	reg const int n(uread());
	reg int m(uread());
	reg int i(0);
	for (; i<n-7; i += 8){
		a[i] = uread();
		a[i+1] = uread();
		a[i+2] = uread();
		a[i+3] = uread();
		a[i+4] = uread();
		a[i+5] = uread();
		a[i+6] = uread();
		a[i+7] = uread();
	}
	
	while (n-i) a[i++] = uread();
	
	do{
		reg const int op(uread()), l(uread()-1), r(uread()-1);
		reg int i(l);
		if (op == 1){
			reg const int x(uread());
			if (x == 2){
				for (; i<=r-7; i+=8){
					!(a[i]&1) ? a[i]>>=1 : 0;
					!(a[i+1]&1) ? a[i+1]>>=1 : 0;
					!(a[i+2]&1) ? a[i+2]>>=1 : 0;
					!(a[i+3]&1) ? a[i+3]>>=1 : 0;
					!(a[i+4]&1) ? a[i+4]>>=1 : 0;
					!(a[i+5]&1) ? a[i+5]>>=1 : 0;
					!(a[i+6]&1) ? a[i+6]>>=1 : 0;
					!(a[i+7]&1) ? a[i+7]>>=1 : 0;
				}
				while (r-i+1){
					!(a[i]&1) ? a[i]>>=1 : 0;
					++i;
				}
			}else if (n == 4){
				for (; i<=r-7; i+=8){
					!(a[i] & 3) ? a[i]>>=2 : 0;
					!(a[i+1] & 3) ? a[i+1]>>=2 : 0;
					!(a[i+2] & 3) ? a[i+2]>>=2 : 0;
					!(a[i+3] & 3) ? a[i+3]>>=2 : 0;
					!(a[i+4] & 3) ? a[i+4]>>=2 : 0;
					!(a[i+5] & 3) ? a[i+5]>>=2 : 0;
					!(a[i+6] & 3) ? a[i+6]>>=2 : 0;
					!(a[i+7] & 3) ? a[i+7]>>=2 : 0;
				}
				while (r-i+1){
					!(a[i]&3) ? a[i]>>=2 : 0;
					++i;
				}
			}else if (x > 2){
				for (; i<=r-7; i+=8){
					!(a[i]%x) ? a[i]/=x : 1;
					!(a[i+1]%x) ? a[i+1]/=x : 1;
					!(a[i+2]%x) ? a[i+2]/=x : 1;
					!(a[i+3]%x) ? a[i+3]/=x : 1;
					!(a[i+4]%x) ? a[i+4]/=x : 1;
					!(a[i+5]%x) ? a[i+5]/=x : 1;
					!(a[i+6]%x) ? a[i+6]/=x : 1;
					!(a[i+7]%x) ? a[i+7]/=x : 1;
				}
				while (r-i+1){
					!(a[i]%x) ? a[i]/=x : 1;
					++i;
				}
			}
		}else{
			reg long long sum1(0), sum2(0), sum3(0), sum4(0), sum5(0), sum6(0), sum7(0), sum8(0);

			for(reg int i(l); i+8<=r; i+=8){
				sum1 += a[i+1];
				sum2 += a[i+2];
				sum3 += a[i+3];
				sum4 += a[i+4];
				sum5 += a[i+5];
				sum6 += a[i+6];
				sum7 += a[i+7];
				sum8 += a[i+8];
			}
			switch ((r-l+1)&7){
				case 7: sum7 += a[r-6];
				case 6: sum6 += a[r-5];
				case 5: sum5 += a[r-4];
				case 4: sum4 += a[r-3];
				case 3: sum3 += a[r-2];
				case 2: sum2 += a[r-1];
				case 1: sum1 += a[r];
			}
			
			if (p3 > (1 << 20)) flush();
			uprint(sum1+sum2+sum3+sum4+sum5+sum6+sum7+sum8);
			pbuf[++p3] = '\n';
		}
	}while (--m);
	
	flush(); 
	
	return 0;
}
2023/5/1 10:23
加载中...