0pts求条玄关
查看原帖
0pts求条玄关
772875
RAY091016楼主2025/6/30 20:22

rt,code如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans,f[100100][5],g[100100][5];
struct data{
	int x,y;
}a[100100];
signed main(){
	cin>>n;
	for(int i=1;i<=2*n;i++){
		cin>>a[i].x>>a[i].y;
		if(a[i].x<=0){
			ans+=(1-a[i].x);
			a[i].x=1;
		}
		if(a[i].x>n){
			ans+=(a[i].x-n);
			a[i].x=n;
		}
		if(a[i].y<=0){
			ans+=(1-a[i].y);
			a[i].y=1;
		}
		if(a[i].y>2){
			ans+=(a[i].y-2);
			a[i].y=2;
		}
		f[a[i].x][a[i].y]++;
	}
	for(int i=1;i<=n;i++){
		g[i][1]=f[i][1]-1,g[i][2]=f[i][2]-1;
	}
	for(int i=1;i<n;i++){
		if(g[i][1]>0&&g[i][2]>0){
			g[i+1][1]+=g[i][1];
			g[i+1][2]+=g[i][2];
			ans+=(g[i][1]+g[i][2]);
		}
		if(g[i][1]>0&&g[i][2]==0){
			g[i+1][1]+=g[i][1];
			ans+=g[i][1];
		}
		if(g[i][1]>0&&g[i][2]<0){
			int p=min(g[i][1],-g[i][2]);
			g[i+1][1]+=(g[i][1]-p);
			g[i+1][2]+=(g[i][2]+p);
			ans+=(p+g[i][1]+g[i][2]);
		}
		if(g[i][1]==0&&g[i][2]>0){
			g[i+1][2]+=g[i][2];
			ans+=g[i][2];
		}
		if(g[i][1]==0&&g[i][2]<0){
			g[i+1][2]+=g[i][2];
			ans-=g[i][2];
		}
		if(g[i][1]<0&&g[i][2]>0){
			int p=min(-g[i][1],g[i][2]);
			g[i+1][1]+=(g[i][1]+p);
			g[i+1][2]+=(g[i][2]-p);
			ans+=(p+g[i][1]+g[i][2]);
		}
		if(g[i][1]<0&&g[i][2]==0){
			g[i+1][1]+=g[i][1];
			ans+=g[i][1];
		}
		if(g[i][1]<0&&g[i][2]<0){
			g[i+1][1]+=g[i][1];
			g[i+1][2]+=g[i][2];
			ans-=(g[i][1]+g[i][2]);
		}
	}
	cout<<ans;
	return 0;
}

2025/6/30 20:22
加载中...