求助 SPOJ 怎么开O2
查看原帖
求助 SPOJ 怎么开O2
701254
Mu_leaf楼主2024/5/9 16:43

本地编译命令里开O2极限数据要跑 4.55s,但是没找到SPOJ上怎么开O2。或者有没有大佬帮我看看有没有什么可以优化的。

#include <bits/stdc++.h>

#pragma GCC optimize(3)

#define int long long
using namespace std;
namespace IO
{
	char buff[1<<21],*p1=buff,*p2=buff;
	char getch(){return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;}
	template<typename T>
	void read(T &x){char ch=getch();int fl=1;x=0;while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}x*=fl;}
	template<typename T,typename ...Args>
	void read(T &x,Args& ...args){read(x);read(args...);}
	char obuf[1<<21],*p3=obuf;
	void putch(char ch) {if(p3-obuf<(1<<21))*p3++=ch;else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;}
	char ch[100];
	template<typename T>
	void write(T x) {if(!x)return putch('0');if(x<0)putch('-'),x*=-1;int top=0;while(x)ch[++top]=x%10+48,x/=10;while(top)putch(ch[top]),top--;}
	template<typename T,typename ...Args>
	void write(T x,Args ...args) {write(x);write(args...);}
	void put(string s){for(int i=0;i<s.size();i++)putch(s[i]);}
	void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
const int N=505+5;
int a[N][N][2],n,q;
namespace FTZSWAN{
	int belong[N],lt[N],rt[N],lazy[N][N],lazy1[N][N],sum[N][N][2];
	inline void init(){
		int siz=23;
		int bnum=n/siz+(n%siz!=0);
		for(int i=1;i<=n;i++) belong[i]=(i-1)/siz+1;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				sum[i][belong[j]][0]+=a[i][j][0];
				sum[i][belong[j]][1]+=a[i][j][1];
			}
		}
		for(int i=1;i<=bnum;i++) lt[i]=(i-1)*siz+1,rt[i]=i*siz;
		rt[bnum]=n;
	} 
	inline void Swap(int _x,int y){
		sum[_x][belong[y]][0]-=a[_x][y][lazy[_x][belong[y]]];
		sum[_x][belong[y]][1]-=a[_x][y][lazy[_x][belong[y]]^1];
		swap(a[_x][y][0],a[_x][y][1]);
		sum[_x][belong[y]][0]+=a[_x][y][lazy[_x][belong[y]]];
		sum[_x][belong[y]][1]+=a[_x][y][lazy[_x][belong[y]]^1];
	}
	inline void change(int sx,int sy,int ex,int ey){
		for(int _x=sx;_x<=ex;_x++){
			if(belong[sy]==belong[ey]){
				for(int y=sy;y<=ey;y++) Swap(_x,y);
			}else{
				for(int y=sy;y<=rt[belong[sy]];y++) Swap(_x,y);
				for(int y=lt[belong[ey]];y<=ey;y++) Swap(_x,y);
				
				for(int i=belong[sy]+1;i<=belong[ey]-1;i++){
					lazy[_x][i]^=1;
					swap(sum[_x][i][0],sum[_x][i][1]);
				}
			}
		}
	}
	inline int query(int sx,int sy,int ex,int ey,int op){
		int ans=0;
		for(int _x=sx;_x<=ex;_x++){
			if(belong[sy]==belong[ey]){
				for(int y=sy;y<=ey;y++) ans+=a[_x][y][op^lazy[_x][belong[y]]];
			}else{
				for(int y=sy;y<=rt[belong[sy]];y++) ans+=a[_x][y][op^lazy[_x][belong[y]]];
				for(int y=lt[belong[ey]];y<=ey;y++) ans+=a[_x][y][op^lazy[_x][belong[y]]];
				for(int i=belong[sy]+1;i<=belong[ey]-1;i++) ans+=sum[_x][i][op];
			}
		}
		return ans;
	}
}
signed main(){
	  freopen("string.in","r",stdin);
 	  freopen("string.out","w",stdout);
	read(n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) read(a[i][j][0]);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) read(a[i][j][1]);
	}
	FTZSWAN::init();
	read(q);
	int opt,sx,sy,ex,ey;
	while(q--){
		
		read(opt,sx,sy,ex,ey);
		if(opt==0){
			FTZSWAN::change(sx,sy,ex,ey);
		}else{
			write(FTZSWAN::query(sx,sy,ex,ey,opt-1));
			putch('\n');
		}
	}
	flush();
}
/*
1         2         xxx2xx      xxx1xx lazy[1][1]=1

  ======>  =======>        ====>        

2         1         xxx1xx      xxx2xx

*/
2024/5/9 16:43
加载中...