本地编译命令里开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
*/