玄关求条(有记录详情)
查看原帖
玄关求条(有记录详情)
683212
Henly_Z楼主2025/7/31 14:39
#include<bits/stdc++.h>
#define int long long
#define ls u<<1
#define rs u<<1|1
#define pii pair<double,int>
using namespace std;
constexpr int N = 1000005;
constexpr double eps = 1e-9;
constexpr int Mod = 39989;
constexpr int mod = 1000000000;
int n;
int cmp(int x , int y) {
	if(x - y > eps) return 1;
	if(y - x > eps) return -1;
	return 0;
}
struct Node {
	double k , b;
} a[N];
int s[N];
int cnt;
double num(int id , int x) {
	return a[id].b + a[id].k * x;
}
void add(int x0 , int y0 , int x1 , int y1) {
	cnt++;
	if(x0 == x1) {
		a[cnt].k = 0;
		a[cnt].b = max(y0 , y1);
	} else {
		a[cnt].k =1.0 * (y0 - y1) / (x0 - x1);
		a[cnt].b = y0 - a[cnt].k * x0;
	}
}

void pushup(int u , int l , int r ,int k) {
	int &v = s[u];
	int mid = (l + r) >> 1; 
	int mid1 = cmp(num(k,mid) , num(v , mid));
	if(mid1 == 1 || (!mid1 && k < v)) swap(k , v);
	int l1 = cmp(num(k , l) , num(v , l));
	int r1 = cmp(num(k , r) , num(v , r));
	if(l1 == 1 || (!l1 && k < v)) pushup(ls , l , mid, k);
	if(r1 == 1 || (!r1 && k < v)) pushup(rs , mid + 1 , r , k);
}

void update(int u , int l , int r , int L , int R , int k) {
//	cout << l << " " << r << " " << L << " " << R << endl; 
	int mid = (l + r) >> 1; 
	if(L <= l && r <= R) {
		pushup(u , l,  r , k);
		return ;
	}
	if(L <= mid) {
		update(ls , l , mid , L, R , k);
	}
	if(R > mid) {
		update(rs , mid + 1 , r , L, R , k);
	}
}

pii pmax(pii x , pii y) {
	if(cmp(x.first , y.first) == -1) {
		return y;
	} else if(cmp(x.first , y.first) == 1) {
		return x;
	} else {
		x.second < y.second ? x : y;
	}
}

pii query(int u , int l , int r , int k) {
	if(r < k || l > k) return {0,0};
	double res = num(s[u] , k);
	int mid = (l + r) >> 1; 
	if(l == r) {
		return {res , s[u]};
	}
	return pmax({res , s[u]} , pmax(query(ls , l , mid , k) , query(rs , mid + 1 , r , k)));
}
signed main() {
	cin >> n;
	int ccnt = 0;
	int lst = 0;
	for(int i = 1 ; i <= n ; i++) {
		int op;
		scanf("%lld",&op);
		if(op == 1) {
			int x0 , y0 , x1 , y1;
			scanf("%lld%lld%lld%lld" , &x0 , &y0 , &x1 , &y1);
			x0 = (x0 + lst - 1 + Mod) % Mod + 1;
			x1 = (x1 + lst - 1 + Mod) % Mod + 1;
			y0 = (y0 + lst - 1 + mod) % mod + 1;
			y1 = (y1 + lst - 1 + mod) % mod + 1;
			if(x0  > x1) {
				swap(x0 , x1);
				swap(y0 , y1);
			}
			add(x0 , y0 , x1 , y1);
			update(1,1 , Mod , x0 , x1 , cnt);
		}
		else{
			int x;
			scanf("%lld",&x);
			x = (x + lst - 1 + Mod) % Mod + 1;
			lst = query(1 , 1 , Mod , x).second;
			if(ccnt >= 1){
				cout << endl;
			}
			ccnt++;
			printf("%lld" , lst);
		}
	}
}

2025/7/31 14:39
加载中...