完全一样的代码,用%2就挂,用&1就能A,在锣鼓和acwing上一样
难道数据里有会导致ans<0的神必情况(?
#include<bits/stdc++.h>
using namespace std;
const int N=5e5;
int n,t,m;
int A[N],B[N],ans1,ans2;
int merge(int l,int r){
int cur=0,mid=(l+r)>>1;
if(l>=r)return 0;
cur+=merge(l,mid);
cur+=merge(mid+1,r);
int i=l,j=mid+1;
for(int k=l;k<=r;k++){
if(j>r or i<=mid and A[i]<=A[j])B[k]=A[i++];
else B[k]=A[j++],cur+=(mid-i+1);
}
for(int k=l;k<=r;k++)A[k]=B[k];
return cur;
}
void solve(){
memset(A,0,sizeof A);
memset(B,0,sizeof B);
m=n*n-1;
for(int i=1,pnt=1;i<=n;i++){
for(int j=1;j<=n;j++,pnt++){
cin>>t;
if(t)A[pnt]=t;
else pnt--;
}
}
ans1=merge(1,m);
memset(A,0,sizeof A);
memset(B,0,sizeof B);
for(int i=1,pnt=1;i<=n;i++){
for(int j=1;j<=n;j++,pnt++){
cin>>t;
if(t)A[pnt]=t;
else pnt--;
}
}
ans2=merge(1,m);
if((ans1&1)==(ans2&1))puts("TAK");
//此处
else puts("NIE");
}
int main(){
while(cin>>n){
solve();
}
}