0pts,求调
查看原帖
0pts,求调
1451616
sfb1363II楼主2024/11/6 19:15
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=510*510;
int n,len,x[N],y[N],b[N],c[N];
int merge(int l,int mid,int r,int a[]){
    int cnt=0;
    int len1=mid-l+1;
    int len2=r-mid;
    for(int i=1;i<=len1;i++)
        b[i]=a[l+i-1];
    for(int i=1;i<=len2;i++)
        c[i]=a[mid+i];
    int i=1,j=1,k=l;
    while(i<=len1&&j<=len2){
        if(b[i]<=c[j]){
            a[k]=b[i];
            i++;
        }
        else{
            a[k]=c[j];
            j++;
            cnt+=(len1-i+1);
        }
        k++;
    }
    while(i<=len1){
        a[k]=b[i];
        i++;
        k++;
    }
    while(j<=len2){
        a[k]=c[j];
        j++;
        k++;
    }
    return cnt;
}
int merge_sort(int l,int r,int a[]){
    int ans=0;
    if(l<r){
        int mid=(l+r)>>1;
        merge_sort(l,mid,a);
        merge_sort(mid+1,r,a);
        ans+=merge(l,mid,r,a);
    }
    return ans;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    while(cin>>n){
        n*=n;
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        len=0;
        for(int i=1;i<=n;i++){
            int p;
            cin>>p;
            if(p!=0) x[++len]=p;
        }
        len=0;
        for(int i=1;i<=n;i++){
            int p;
            cin>>p;
            if(p!=0) y[++len]=p;
        }
        int ans1=merge_sort(1,n-1,x);
        int ans2=merge_sort(1,n-1,y);
        if((ans1%2)==(ans2%2)) cout<<"TAK\n";
        else cout<<"NIE\n";
    }
    return 0;
}
2024/11/6 19:15
加载中...