sub#0全A,sub#1只A了#10,求调
查看原帖
sub#0全A,sub#1只A了#10,求调
1487902
gaozixuan121212楼主2025/2/7 16:20

代码:

#include<bits/stdc++.h>//我嘞个c++
using namespace std;
#define int long long
#define double long double
#define endl '\n'
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define ms(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)

inline int read()
{
	int x = 0, f = 1;
    char ch = getchar();
    while(ch > 57 || ch < 48)
	{
        if(ch == 45) f = -1;
        ch = getchar();
    }
    while(ch >= 48 && ch <= 57)
	{
        x = (x<<1) + (x<<3) + (ch^48);
        ch = getchar();
    }
    return x * f;
}

const double eps = 1e-9;

int cmp(double x, double y)
{
	if (x - y > eps) return 1;
	if (y - x > eps) return -1;
	return 0;
}

int n;
double k[200010], b[200010];
int cnt;
int f[400010];

inline pair<double,int> max(pair<double,int> x, pair<double,int> y)
{
//	cout << x.fi << ' ' << y.fi << endl;
	if(cmp(x.fi, y.fi) == -1) return y;
	else if(cmp(x.first, y.first) == 1) return x;
	else return x.second < y.second ? x : y;
}

inline double Y(int id, int x)
{
	return k[id]*x+b[id];
}

inline void update(int k, int l, int r, int u)
{
	int mid = l + r >> 1;
	int &v = f[k];
	int bmid = cmp(Y(u, mid), Y(v, mid));
	if (bmid == 1 || (!bmid && u < v)) swap(u, v);
	int bl = cmp(Y(u, l), Y(v, l)), br = cmp(Y(u, r), Y(v, r));
	if (bl == 1 || (!bl && u < v)) update(k << 1, l, mid, u);
	if (br == 1 || (!br && u < v)) update(k << 1 | 1, mid + 1, r, u);
}

inline void add(int k, int l, int r, int x, int y, int id)
{
	if(l > y || r < x) return;
	if(r <= y && l >= x)
	{
		update(k,l,r,id);
		return;
	}
	int mid = l + r >> 1;
	add(k<<1,l,mid,x,y,id);
	add(k<<1|1,mid+1,r,x,y,id);
}

inline pair<double,int> query(int k, int l, int r, int u)
{
	pair<double,int> mmax;
	mmax = mk(Y(f[k],u),f[k]);
	if(l == r) return mmax;
	int mid = l + r >> 1;
	if(u <= mid) return max(mmax,query(k<<1,l,mid,u));
	else return max(mmax,query(k<<1|1,mid+1,r,u));
}
int mod = 1e9;

signed main()
{
	n = read();
	int ans = 0;
	while(n--)
	{
		int id = read();
		if(id)
		{
			int x0 = read(), y0 = read(), x1 = read(), y1 = read();
			x0 = ((x0+ans-1)%39989) + 1;
			y0 = ((y0+ans-1)%mod) + 1;
			x1 = ((x1+ans-1)%39989) + 1;
			y1 = ((y1+ans-1)%mod) + 1;
			if(x0 > x1) swap(x0, x1), swap(y0, y1);
			if(x0 == x1)
			{
				k[++cnt] = 0, b[cnt]  = max(y0,y1);
			}
			else
			{
				k[++cnt] = 1.0*(y1-y0)/(x1-x0);
				b[cnt] = (1.0*y0*x1-1.0*y1*x0)/(x1-x0);
			}
//			cout << x0 << ' ' << x1 <<endl;
//			cout << k[cnt] << ' ' << b[cnt] << endl;
			add(1,1,39989,x0,x1,cnt);
		}
		else
		{
			int x = read();
			x = ((x+ans-1+39989)%39989) + 1;
//			--x;
			ans = query(1,1,40000,x).se;
//			if(ans < 0) ans = 0;
			cout << ans << endl;
		}
	}
	return 0;
}
2025/2/7 16:20
加载中...