归并排序TLE 25pts 求调
查看原帖
归并排序TLE 25pts 求调
421634
QT___楼主2024/10/24 11:39

#15 16 19 20 22 23 24 27 28 TLE 剩下的AC

我寻思这才nlogn啊,咋T的啊

总不可能是快读爆了吧

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#define N 1000010

using namespace std;
typedef long long LL;

inline LL read()
{
	LL xx=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){xx=xx*10+ch-'0';ch=getchar();}
	return xx*f;
}
void write(LL xx)
{
	if(xx<0){xx=-xx;putchar('-');}
	if(xx>9) write(xx/10);
	putchar(xx%10+'0');
	return;
}
LL n,goal[2][N],a[2][N],dic[N*2],wh[N*2],s[N],ans;
void End(){printf("dldsgay!!1\n");return;}
void msort(int l,int r)
{
	if(l==r) return;
	LL mid=(l+r)/2;
	msort(1,mid);msort(mid+1,r);
	LL i=l,j=mid+1,k=l;
	while(i<=mid&&j<=r)
	{
		if(wh[i]<=wh[j]) s[k++]=wh[i++];
		if(wh[i]>wh[j]) s[k++]=wh[j++],ans+=mid-i+1;
	}
	while(i<=mid) s[k++]=wh[i++];
	while(j<=r) s[k++]=wh[j++];
	for(int i0=l;i0<=r;i0++) wh[i0]=s[i0];
	return;
}
void Start()
{
	n=read();
	for(int i=0;i<2;i++) for(int j=1;j<=n;j++){a[i][j]=read();wh[a[i][j]]=j;}
	for(int i=0;i<2;i++) for(int j=1;j<=n;j++){goal[i][j]=read();dic[goal[i][j]]=j;}
	for(int i=1;i<=n;i++)
	{
		int id=dic[a[0][i]];
		int f=0,l=dic[a[0][i]]-wh[a[0][i]];
		if(l<0) l=-l;
		if(goal[0][id]!=a[0][i]&&goal[1][id]!=a[0][i]){End();return;}
		if(goal[0][id]!=a[1][i]&&goal[1][id]!=a[1][i]){End();return;}
		if(goal[0][dic[a[0][i]]]!=a[0][i]) f=1;
		if(l%2!=f){End();return;}
	}
	for(int i=1;i<=n;i++) wh[i]=dic[a[0][i]];
	msort(1,n);
	write(ans);
	return;
}
int main()
{
	Start();
	return 0;
}
2024/10/24 11:39
加载中...