求查错,已经看了几小时
查看原帖
求查错,已经看了几小时
294562
EDqwq楼主2021/3/9 14:36
/*
  Author: EnderDeer
  Online Judge: Luogu
*/

#include<bits/stdc++.h>

#define int long long
#define mem(x) memset(x,0,sizeof(x))

using namespace std;

int read(){
   int s = 0,w = 1;
   char ch = getchar();
   while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
   while(ch >= '0' && ch <= '9')s = s * 10 + ch - '0',ch = getchar();
   return s * w;
}

int n,m;
int num[1000010];
int l[1000010],r[1000010];
int block,len;
int a[1000010],b[1000010];
int ans;

void updateans(int x,int y){
	int res = 0;
	int posl = num[x];
	int posr = num[y];
	if(posl == posr){
		if(a[x] > a[y])res --;
		else if(a[y] < a[x])res ++;
		for(int i = x + 1;i <= y - 1;i ++){
			if(a[x] > a[i])res --;
			else if(a[x] < a[i])res ++;
			if(a[y] > a[i])res ++;
			else if(a[y] < a[i])res --;
		}
		ans += res;
		swap(a[x],a[y]);
		for(int i = l[num[x]];i <= r[num[x]];i ++)b[i] = a[i];
		sort(b + l[num[x]],b + r[num[x]] + 1);
		return ; 
	}
	if(a[x] > a[y])res --;
	else if(a[y] < a[x])res ++;
	for(int i = x + 1;i <= r[posl];i ++){
		if(a[x] > a[i])res --;
		else if(a[x] < a[i])res ++;
		if(a[y] > a[i])res ++;
		else if(a[y] < a[i])res --;
	}
	for(int i = posl + 1;i <= posr - 1;i ++){
		int xx = lower_bound(b + l[i],b + r[i] + 1,a[x]) - (b + l[i]);
		int yy = lower_bound(b + l[i],b + r[i] + 1,a[y]) - (b + l[i]);
		res = res - (xx - yy) * 2;
	}
	for(int i = l[posr];i <= y - 1;i ++){
		if(a[x] > a[i])res --;
		else if(a[x] < a[i])res ++;
		if(a[y] > a[i])res ++;
		else if(a[y] < a[i])res --;
	}
	ans += res;
	swap(a[x],a[y]);
	for(int i = l[num[x]];i <= r[num[x]];i ++)b[i] = a[i];
	for(int i = l[num[y]];i <= r[num[y]];i ++)b[i] = a[i];
	sort(b + l[num[x]],b + r[num[x]] + 1);
	sort(b + l[num[y]],b + r[num[y]] + 1);
}

signed main(){
	cin>>n>>m;
	block = sqrt(n);
	len = ceil(n * 1.0 / block);
	for(int i = 1;i <= n;i ++){
		a[i] = b[i] = i;
		num[i] = (i - 1) / block + 1;
	}
	for(int i = 1;i <= len;i ++){
		l[i] = (i - 1) * block + 1;
		r[i] = i * block;
		r[len] = n;
		sort(b + l[i],b + r[i] + 1); 
	}
	r[len] = n;
	while(m --){
		int x,y;
		x = read(),y = read();
		if(x > y)swap(x,y);
		updateans(x,y);
		printf("%lld\n",ans);
	}
	return 0;
}
2021/3/9 14:36
加载中...