逆天李超树(灌水大佬多)
  • 板块灌水区
  • 楼主qzyz_cye
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/13 19:48
  • 上次更新2024/7/13 20:48:49
查看原帖
逆天李超树(灌水大佬多)
506472
qzyz_cye楼主2024/7/13 19:48

模板P4097 不判点相等时编号大小评测结果

判点相等时编号大小这里

玄关求调

#include<bits/stdc++.h>
using namespace std;
const int mod=39989,mod2=1e9+1;
const double eps=1e-9;
int T,lans,op,x0,yo,x1,yl,cnt,ls;
struct ss
{
	double k,b;
	int l,r;
}ed[100005];
void add()
{
	cnt++;
	if(x0==x1)
	{
		ed[cnt].l=ed[cnt].r=x0;
		ed[cnt].k=0;
		ed[cnt].b=max(yo,yl);
	}
	ed[cnt].l=x0;
	ed[cnt].r=x1;
	ed[cnt].k=(double)(yl-yo)*1.000/(double)(x1-x0);
	ed[cnt].b=yo*1.000-x0*ed[cnt].k;
}
struct sd
{
	int l,r;
	int sid;
}tr[300005];
double cacl(int id,int pos)
{
	return ed[id].k*pos+ed[id].b;
}
int cmp(double aa,double bb)
{
	if(aa-bb>=eps) return 1;
	if(bb-aa>=eps) return -1;
	return 0;
}
void upd(int pos,int id)
{
	ls=(tr[pos].l+tr[pos].r)/2;
	double mid=ls;
	if(tr[pos].sid==0) 
	{
		tr[pos].sid=id;
		return ;
	}
	int fl=cmp(cacl(id,mid),cacl(tr[pos].sid,mid));
	if(fl==1||(fl==0&&id<tr[pos].sid))
	{
		swap(id,tr[pos].sid);
	}
	if(tr[pos].l==tr[pos].r) return ;
	fl=cmp(cacl(id,tr[pos].l),cacl(tr[pos].sid,tr[pos].l));
	if(fl==1||(fl==0&&id<tr[pos].sid))
	{
		upd(pos*2,id);
		return ;
	}
	fl=cmp(cacl(id,tr[pos].r),cacl(tr[pos].sid,tr[pos].r));
	if(fl==1||(fl==0&&id<tr[pos].sid))
	{
		upd(pos*2+1,id);
		return ;
	}
	return ;
}
void update(int pos,int l,int r,int id)
{
	if(tr[pos].r<l||tr[pos].l>r) return ;
	if(tr[pos].l>=l&&tr[pos].r<=r)
	{
		upd(pos,id);
		return ;
	}
	update(pos*2,l,r,id);
	update(pos*2+1,l,r,id);
}
void build(int pos,int l,int r)
{
	tr[pos].l=l;
	tr[pos].r=r;
	if(l==r) return ;
	build(pos*2,l,(l+r)/2);
	build(pos*2+1,(l+r)/2+1,r);
}
void query(int id,int k)
{
	if(tr[id].l>k||tr[id].r<k) return ;
	int fl=cmp(cacl(tr[id].sid,k),cacl(lans,k));
	if(fl==1||(fl==0&&tr[id].sid<lans))
	{
		lans=tr[id].sid;
	}
	if(tr[id].l==tr[id].r) return ;
	query(id*2,k);
	query(id*2+1,k);
}
int main()
{
	build(1,1,mod);
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&op);
		if(op==0)
		{
			scanf("%d",&x0);
			x0=(x0+lans-1)%mod+1;
			lans=0;
			query(1,x0);
			printf("%d\n",lans);
		}
		else
		{
			scanf("%d%d%d%d",&x0,&yo,&x1,&yl);
			x0=(x0+lans-1)%mod+1;
			x1=(x1+lans-1)%mod+1;
			yo=(yo+lans-1)%mod2+1;
			yl=(yl+lans-1)%mod2+1;
			if(x0>x1) swap(x0,x1),swap(yo,yl);
			add();
			update(1,x0,x1,cnt);
		}
	}
	return 0;
}
2024/7/13 19:48
加载中...