大佬求调
  • 板块学术版
  • 楼主cdxxx04
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/11 21:03
  • 上次更新2024/8/11 21:58:02
查看原帖
大佬求调
1256312
cdxxx04楼主2024/8/11 21:03

题目

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f,N=2e6+5;

int n,m,q,k[N*4];

int Binary_search(int x){
	int l=1,r=(m>>2),ret=(m>>2)+1;
	while(l<=r){
		int mid=(l+r)>>1;
		if(k[mid]<=x)	ret=min(ret,mid),l=mid+1;
		else	r=mid-1;
	}
	return ret;
}//二分找离第一个在k数组中第一个小于x的下标

int realy(int x){return (x-1)%(n<<1)+1;}
//得到原编号

int round(int x,int y){return min(abs(x-y),(n<<1)-abs(x-y));}
//从环上的距离

int straight(int x,int y){
	int address=Binary_search(x);
	//二分查找离x最近的一对朋友
	int left=INF,right=INF;
	if(address<=m){
		int* a;	a=&k[address];
		left=round(x,realy(*a))+round(realy(*a+n),y);
	}//从左边的朋友传
	if(address>1){
		int* b;	b=&k[address-1];
		right=round(x,realy(*b))+round(realy(*b+n),y);
	}//从右边的朋友传
	return min(right,left)+1;
}

int distance(int x,int y){return min(round(x,y),straight(x,y));}

signed main(){
	ios::sync_with_stdio(false);	cin.tie(nullptr);
	//读写加速
	
	cin>>n>>m>>q;
	//输入人数、朋友数、询问次数。
	for(int i=1;i<=m;i++)	cin>>k[i],k[i+m]=++k[i]+n;
	//应该没有人想处理(0~2n-1)吧
	
	m<<=2;
	for(int i=1;i<=m;i++)	k[i+m]=k[i]+(n<<1);
	//方便处理右侧人编号较起始人编号小的情况,复制加上2n。
	m<<=2;
	
	for(int i=1,x,y;i<=q;i++){
		cin>>x>>y;	x++;	y++;
		//输入传球的两人,编号从0开始所以加1。
		cout<<min(distance(x,y),distance(y,x))<<'\n';
		//分别考略从环上传和对边传
	}
	return 0;
}
2024/8/11 21:03
加载中...