一直没对,没找到什么问题,求大佬解答
查看原帖
一直没对,没找到什么问题,求大佬解答
1164717
Monkey000001楼主2025/7/24 20:50
#include<bits/stdc++.h>
using namespace std;
typedef pair<double,int> pdi;
const int N=1e5+5,M1=39989,M2=1e9;
struct le{
	double k,b;
};
struct node{
	int l,r;
	int p;
}tr[4*N];
int n;
int cnt,lastans=0;
le l[N];
const double eps=1e-9;
void build(int l,int r,int k)
{
	tr[k].l=l,tr[k].r=r;
	tr[k].p=0;
	if(l==r)	return ;
	int mid=(l+r)/2;
	build(l,mid,2*k);
	build(mid+1,r,2*k+1);
}
void add_len(int x0,int y0,int x1,int y1)
{
	cnt++;
	if(x0==x1)
	{
		l[cnt].k=0;
		l[cnt].b=max(y0,y1);
	}
	else
	{
		l[cnt].k=1.0*(y1-y0)/(x1-x0);
		l[cnt].b=y1-l[cnt].k*x1;
	}
	
}
double calc(int p,int x)
{
	return l[p].b+l[p].k*x;
}
int cmp(double a,double b)
{
	if(a-b>eps)	return 1;
	if(a-b<eps)	return -1;
	return 0;
}
void upd(int k,int x,int y,int up)
{
	int &p=tr[k].p,mid=(x+y)/2;
	int bmid=cmp(calc(up,mid),calc(p,mid));
  	if (bmid==1 || (!bmid &&up<p)) swap(up,p);
  	int bl=cmp(calc(up,x),calc(p,x)),br=cmp(calc(up,y),calc(p,y));
  	if (bl==1||(!bl&&up<p)) upd(k<<1,x,mid,up);
  	if (br==1||(!br&&up<p)) upd(k<<1|1,mid + 1,y,up);
}
void update(int k,int x,int y,int up)
{
	int l=tr[k].l,r=tr[k].r;
	if(x<=l&&r<=y)
	{
		upd(k,l,r,up);
		return ;
	}
	int mid=(l+r)/2;
	if(x<=mid)	update(2*k,x,y,up);
	if(y>mid)	update(2*k+1,x,y,up);
 } 
pdi pmx(pdi x,pdi y)
{
	if (cmp(x.first, y.first) == -1)
    	return y;
  	else if (cmp(x.first, y.first) == 1)
    	return x;
  	else
    	return x.second < y.second ? x : y;
}
pdi query(int k,int x)
{
	int l=tr[k].l,r=tr[k].r;
	if(l>x||r<x)	return {0,0};
	int mid=(l+r)/2;
	double ans=calc(tr[k].p,x);
	if(l==r)
		return (pdi){ans,tr[k].p};
	return pmx((pdi){ans,tr[k].p},pmx(query(2*k,x),query(2*k+1,x)));
}
int main()
{
	cin>>n;
	build(1,M1,1);
	for(int i=1;i<=n;i++)
	{
		int op;
		cin>>op;
		if(op==0)
		{
			int k;
			cin>>k;
			k=(k+lastans-1+M1)%M1+1;
			lastans=query(1,k).second;
			cout<<lastans<<endl;
		}
		else
		{
			int x0,y0,x1,y1;
			cin>>x0>>y0>>x1>>y1;
			if(x1<x0)
			{
				swap(x1,x0);
				swap(y1,y0);
			}
			x0=(x0+lastans-1+M1)%M1+1;
			y0=(y0+lastans-1+M2)%M2+1;
			x1=(x1+lastans-1+M1)%M1+1;
			y1=(y1+lastans-1+M2)%M2+1;
			add_len(x0,y0,x1,y1);
			update(1,x0,x1,cnt);
		}
	}
	return 0;
} 
2025/7/24 20:50
加载中...