OLE???
查看原帖
OLE???
957618
oyoham楼主2024/5/27 17:40

OLE是啥呀? OLErecord 代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
inline ll read(){
	ll x=0;
	short f=1;
	char c=getchar();
	while(c>57||c<48){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c<58&&c>47){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void write(ll x){
	if(x<0ll) putchar(45),x=~x+1;
	if(x>9ll) write(x/10);
	putchar(x%10|48);
}
int n=read();
int lastans=0;
int _get(){
	return (read()+lastans-1)%39989+1;
}
int _ret(int x){
	write(lastans=x);
	putchar(10);
}
#define eps 1e-7
int dcmp(double a,double b){
	return abs(a-b)<eps?0:(a<b)?-1:1;
}
struct Seg{
	int sx,ex,sy,ey;
	double k;
	Seg(){}
	Seg(int xs,int xe,int ys,int ye){
		sx=xs;ex=xe;ey=ye;sy=ys;
		k=sx==ex?(ey=sy=max(ey,sy),0):(0.+ey-sy)/(ex-sx);
	}
	double get(int p){
		return sx+k*(p-sy);
	}
}S[100005];
double getx(Seg x,Seg y){
	return (y.get(0)-x.get(0))/(x.k-y.k);
}
int idx;
int cmp(Seg s1,Seg s2,int cmpp){
	return dcmp(s1.get(cmpp),s2.get(cmpp));
}
int mx[400005],lp[400005],rp[400005];
#define ls id<<1
#define rs id<<1|1
void build(int id,int l,int r){
//	if(id>100000)printf("%d:%d %d\n",id,l,r);
	mx[id]=0;
	lp[id]=l;
	rp[id]=r;
	if(l==r) return;
	build(ls,l,l+r>>1);
	build(rs,(l+r>>1)+1,r);
}

void modify(int id,int cg){
	double _sy=S[mx[id]].get(lp[id]),_ey=S[mx[id]].get(rp[id]),nsy=S[cg].get(lp[id]),ney=S[cg].get(rp[id]);
	if(dcmp(nsy,_sy)!=1&&dcmp(nsy,_sy)!=1) return;
	if(dcmp(nsy,_sy)==1&&dcmp(nsy,_sy)==1) return mx[id]=cg,void();
	int mid=lp[id]+rp[id]>>1;
	double _my=S[mx[id]].get(mid),nmy=S[cg].get(mid);
	if(nmy-_my>1e-7) swap(mx[id],cg);
	if(dcmp(getx(S[cg],S[mx[id]]),mid)!=1) modify(ls,cg);
	else modify(rs,cg);
}
void update(int id,int x){
	if(lp[id]>S[x].ex||rp[id]<S[x].sx) return;
	if(S[x].sx<=lp[id]&&rp[id]<=S[x].ex){
		modify(id,x);
//		printf("%d-%d~%d\n",id,lp[id],rp[id]);
		return ;
	}
	update(ls,x);
	update(rs,x);
}
int ans;
int query(int id,int pos){
	if(lp[id]==rp[id]){
		return mx[id];
	}
	int ret=pos<=(lp[id]+rp[id]>>1)?query(ls,pos):query(rs,pos);
	return (dcmp(S[ret].get(pos),S[mx[id]].get(pos))==0?min(ret,mx[id]):dcmp(S[ret].get(pos),S[mx[id]].get(pos))==1?ret:mx[id]);
}

void print(int l,int r,int id=1){
//	if(lp[id]>=l&&rp[id]<=r) printf("%d:%d~%d %d\n",id,lp[id],rp[id],mx[id]);
	if(lp[id]==rp[id]) return;
	print(l,r,ls);
	print(l,r,rs);
}
signed main(){
	build(1,1,40000);
	for(int i=1;i<=n;i++){
		int op=read();
		if(op==1){
			int x1=_get(),y1=_get(),x2=_get(),y2=_get();
			if(x2<x1) swap(x2,x1),swap(y2,y1);
			S[++idx]=Seg(x1,x2,y1,y2);
			update(1,idx);
		}
		else{
			int x=_get();
			_ret(query(1,x));
		}
//		print(1,12);
	}
}
2024/5/27 17:40
加载中...