求助,关于循环展开
查看原帖
求助,关于循环展开
473188
NaHCO3_tht楼主2023/11/17 08:06

RT,关于第二个子任务,问什么循环展开写假了,悬关

#include<bits/stdc++.h>
using namespace std;
typedef unsigned int u32;
typedef unsigned long long u64;
int case_id;
inline u32 next_integer(u32 x) {
	x ^= x << 13;
  	x ^= x >> 17;
	x ^= x << 5;
	return x;
}
bool output_arr(void *a, u32 size) {
	if (size % 4) {
	    return puts("-1"), 0;
	}
	u32 blocks = size / 4;
	u32 *A = (u32 *)a;
	u32 ret = size;
	u32 x = 23333333;
	for (u32 i = 0; i < blocks; i++) {
		ret = ret ^ (A[i] + x);
	    x^=x<<13;
	    x^=x>>17;
	    x^=x<<5;
	}
	
    return printf("%u\n", ret), 1;
}
namespace sorting{
	const int NN=2e8+5;
	u32 n,s,a[NN];
	u32 base,maxv,cnt[4096],tmp[NN];
	void main(){
		cin>>n>>s;
		a[0]=next_integer(s);
		maxv=a[0];
		for(int i=1;i<n;i=-~i){
			a[i]=next_integer(a[i-1]);
			maxv=max(maxv,a[i]);
		}
		base=4096;
		u32 now=1;
		u32 Up_base=base<<2,Up_n=n<<2;
		while(maxv){
			memset(cnt,0,Up_base);
			for(int i=0;i<n;i=-~i) ++cnt[(a[i]/now)&4095];
			for(int i=1;i<base;i=-~i) cnt[i]+=cnt[i-1];
			for(int i=n-1;~i;--i){
				int k=(a[i]/now)&4095;
				tmp[cnt[k]-1]=a[i];
				--cnt[k];
			}
			memcpy(a,tmp,Up_n);
			now<<=12;
			maxv>>=12;
		}
		output_arr(a,Up_n);
	}
}
namespace game {
	const int NN=3e5+5;
	int n,q;
	string l1,l2;
	bitset<NN>stl1,pal1,ssl1,stl2,pal2,ssl2;
	bitset<NN>st10,st20,pa10,pa20,ss10,ss20;
	bitset<NN>st11,st21,pa11,pa21,ss11,ss21;
	bitset<NN>st12,st22,pa12,pa22,ss12,ss22;
	bitset<NN>st13,st23,pa13,pa23,ss13,ss23;
	bitset<NN>st14,st24,pa14,pa24,ss14,ss24;
	bitset<NN>st15,st25,pa15,pa25,ss15,ss25;
	bitset<NN>st16,st26,pa16,pa26,ss16,ss26;
	bitset<NN>st17,st27,pa17,pa27,ss17,ss27;
	u32 b[NN],x[NN],y[NN],l[NN];
	void main() {
	    cin>>n>>q;
	    cin>>l1>>l2;
	    stl1=pal1=ssl1=stl2=pal2=ssl2=0;
	    for(int i=0;i<n;i++){
	    	if(l1[i]=='0'){
	    		stl1[i]=1; 
			}else if(l1[i]=='1'){
				ssl1[i]=1;
			}else if(l1[i]=='2'){
				pal1[i]=1;
			}
		}
		for(int i=0;i<n;i++){
	    	if(l2[i]=='0'){
	    		stl2[i]=1; 
			}else if(l2[i]=='1'){
				ssl2[i]=1;
			}else if(l2[i]=='2'){
				pal2[i]=1;
			}
		}
		for(int i=0;i<q;i++){
			cin>>x[i]>>y[i]>>l[i];
		}
	    for(int i=0;i+8<=q;i+=8){
	    	st10=stl1>>x[i];
	    	st11=stl1>>x[i+1];
	    	st12=stl1>>x[i+2];
	    	st13=stl1>>x[i+3];
	    	st14=stl1>>x[i+4];
	    	st15=stl1>>x[i+5];
	    	st16=stl1>>x[i+6];
	    	st17=stl1>>x[i+7];
	    	
	    	st10=st10^((st10>>l[i])<<l[i]);
	    	st11=st11^((st11>>l[i+1])<<l[i+1]);
	    	st12=st12^((st12>>l[i+2])<<l[i+2]);
	    	st13=st13^((st13>>l[i+3])<<l[i+3]);
	    	st14=st14^((st14>>l[i+4])<<l[i+4]);
	    	st15=st15^((st15>>l[i+5])<<l[i+5]);
	    	st16=st16^((st16>>l[i+6])<<l[i+6]);
	    	st17=st17^((st17>>l[i+7])<<l[i+7]);
	    	
	    	pa10=pal1>>x[i];
	    	pa11=pal1>>x[i+1];
	    	pa12=pal1>>x[i+2];
	    	pa13=pal1>>x[i+3];
	    	pa14=pal1>>x[i+4];
	    	pa15=pal1>>x[i+5];
	    	pa16=pal1>>x[i+6];
	    	pa17=pal1>>x[i+7];
	    	
	    	pa10=pa10^((pa10>>l[i])<<l[i]);
	    	pa11=pa11^((pa11>>l[i+1])<<l[i+1]);
	    	pa12=pa12^((pa12>>l[i+2])<<l[i+2]);
	    	pa13=pa13^((pa13>>l[i+3])<<l[i+3]);
	    	pa14=pa14^((pa14>>l[i+4])<<l[i+4]);
	    	pa15=pa15^((pa15>>l[i+5])<<l[i+5]);
	    	pa16=pa16^((pa16>>l[i+6])<<l[i+6]);
	    	pa17=pa17^((pa17>>l[i+7])<<l[i+7]);
	    	
	    	ss10=ssl1>>x[i];
	    	ss11=ssl1>>x[i+1];
	    	ss12=ssl1>>x[i+2];
	    	ss13=ssl1>>x[i+3];
	    	ss14=ssl1>>x[i+4];
	    	ss15=ssl1>>x[i+5];
	    	ss16=ssl1>>x[i+6];
	    	ss17=ssl1>>x[i+7];
	    	
	    	ss10=ss10^((ss10>>l[i])<<l[i]);
	    	ss11=ss11^((ss11>>l[i+1])<<l[i+1]);
	    	ss12=ss12^((ss12>>l[i+2])<<l[i+2]);
	    	ss13=ss13^((ss13>>l[i+3])<<l[i+3]);
	    	ss14=ss14^((ss14>>l[i+4])<<l[i+4]);
	    	ss15=ss15^((ss15>>l[i+5])<<l[i+5]);
	    	ss16=ss16^((ss16>>l[i+6])<<l[i+6]);
	    	ss17=ss17^((ss17>>l[i+7])<<l[i+7]);
	    	
	    	st20=stl2>>y[i];
	    	st21=stl2>>y[i+1];
	    	st22=stl2>>y[i+2];
	    	st23=stl2>>y[i+3];
	    	st24=stl2>>y[i+4];
	    	st25=stl2>>y[i+5];
	    	st26=stl2>>y[i+6];
	    	st27=stl2>>y[i+7];
	    	
	    	st20=st20^((st20>>l[i])<<l[i]);
	    	st21=st21^((st21>>l[i+1])<<l[i+1]);
	    	st22=st22^((st22>>l[i+2])<<l[i+2]);
	    	st23=st23^((st23>>l[i+3])<<l[i+3]);
	    	st24=st24^((st24>>l[i+4])<<l[i+4]);
	    	st25=st25^((st25>>l[i+5])<<l[i+5]);
	    	st26=st26^((st26>>l[i+6])<<l[i+6]);
	    	st27=st27^((st27>>l[i+7])<<l[i+7]);
	    	
	    	pa20=pal2>>y[i];
	    	pa21=pal2>>y[i+1];
	    	pa22=pal2>>y[i+2];
	    	ss22=ssl2>>y[i+2];
	    	pa23=pal2>>y[i+3];
	    	pa24=pal2>>y[i+4];
	    	pa25=pal2>>y[i+5];
	    	pa26=pal2>>y[i+6];
	    	pa27=pal2>>y[i+7];   	
	    	
	    	pa20=pa20^((pa20>>l[i])<<l[i]);
	    	pa21=pa21^((pa21>>l[i+1])<<l[i+1]);
	    	pa22=pa22^((pa22>>l[i+2])<<l[i+2]);
	    	pa23=pa23^((pa23>>l[i+3])<<l[i+3]);
	    	pa24=pa24^((pa24>>l[i+4])<<l[i+4]);
	    	pa25=pa25^((pa25>>l[i+5])<<l[i+5]);
	    	pa26=pa26^((pa26>>l[i+6])<<l[i+6]);
	    	pa27=pa27^((pa27>>l[i+7])<<l[i+7]);
	    	
	    	ss20=ssl2>>y[i];
	    	ss21=ssl2>>y[i+1];
	    	ss22=ssl2>>y[i+2];
	    	ss23=ssl2>>y[i+3];
	    	ss24=ssl2>>y[i+4];
	    	ss25=ssl2>>y[i+5];
	    	ss26=ssl2>>y[i+6];
	    	ss27=ssl2>>y[i+7];
	    	
	    	ss20=ss20^((ss20>>l[i])<<l[i]);
	    	ss21=ss21^((ss21>>l[i+1])<<l[i+1]);
	    	ss22=ss22^((ss22>>l[i+2])<<l[i+2]);
	    	ss23=ss23^((ss23>>l[i+3])<<l[i+3]);
	    	ss24=ss24^((ss24>>l[i+4])<<l[i+4]);
	    	ss25=ss25^((ss25>>l[i+5])<<l[i+5]);
	    	ss26=ss26^((ss26>>l[i+6])<<l[i+6]);
	    	ss27=ss27^((ss27>>l[i+7])<<l[i+7]);
	    	
	    	b[i]+=(st10&ss20).count();
	    	b[i+1]+=(st11&ss21).count();
	    	b[i+2]+=(st12&ss22).count();
	    	b[i+3]+=(st13&ss23).count();
	    	b[i+4]+=(st14&ss24).count();
	    	b[i+5]+=(st15&ss25).count();
	    	b[i+6]+=(st16&ss26).count();
	    	b[i+7]+=(st17&ss27).count();
	    	
	    	b[i]+=(ss10&pa20).count();
	    	b[i+1]+=(ss11&pa21).count();
	    	b[i+2]+=(ss12&pa22).count();
	    	b[i+3]+=(ss13&pa23).count();
	    	b[i+4]+=(ss14&pa24).count();
	    	b[i+5]+=(ss15&pa25).count();
	    	b[i+6]+=(ss16&pa26).count();
	    	b[i+7]+=(ss17&pa27).count();
	    	
			b[i]+=(pa10&st20).count();
	    	b[i+1]+=(pa11&st21).count();
	    	b[i+2]+=(pa12&st22).count();
	    	b[i+3]+=(pa13&st23).count();
	    	b[i+4]+=(pa14&st24).count();
	    	b[i+5]+=(pa15&st25).count();
	    	b[i+6]+=(pa16&st26).count();
	    	b[i+7]+=(pa17&st27).count();
		}
		int qq;
		qq=(q/8)*8; 
		while(qq<q){
			st10=stl1>>x[qq];
	    	st10=st10^((st10>>l[qq])<<l[qq]);
	    	pa10=pal1>>x[qq];
	    	pa10=pa10^((pa10>>l[qq])<<l[qq]);
	    	ss10=ssl1>>x[qq];
	    	ss10=ss10^((ss10>>l[qq])<<l[qq]);
	    	st20=stl2>>y[qq];
	    	st20=st20^((st20>>l[qq])<<l[qq]);
	    	pa20=pal2>>y[qq];
	    	pa20=pa20^((pa20>>l[qq])<<l[qq]);
	    	ss20=ssl2>>y[qq];
	    	ss20=ss20^((ss20>>l[qq])<<l[qq]);
	    	b[qq]+=(st10&ss20).count();
	    	b[qq]+=(ss10&pa20).count();
	    	b[qq]+=(pa10&st20).count();
			++qq;
		}
//		for(int i=0;i<q;i++){
//			cout<<b[i]<<'\n';
//		}
		output_arr(b,q*4);
	}
}
int main(){
//	freopen("challenge.in","r",stdin);
//	double st=clock();
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>case_id;
	if(case_id==1){
		sorting::main();
	}else if(case_id==2){
		game::main();
//		cout<<(clock()-st)<<'\n';
	}else{
		
	}

	return 0;
}
2023/11/17 08:06
加载中...