为什么本题会MLE啊
查看原帖
为什么本题会MLE啊
1016560
Imerance1018楼主2024/9/2 23:51

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
const double eps=1e-10;
int n,cnt;
struct line
{
	double k,b;
	double ask(int x)
	{
		return (x-1)*k+b;
	}
}a[N];
#define lc x<<1
#define rc x<<1|1
#define mid ((l+r)>>1)
struct LSegtree
{
	int id[N<<1];
	inline void updata(int x,int l,int r,int i)
	{
		if(!id[x])
		{
			id[x]=i;
			return;
		}
		if(a[i].ask(mid)-a[id[x]].ask(mid)>eps)swap(i,id[x]);
		if(a[i].ask(l)-a[id[x]].ask(l)>eps||(a[i].ask(l)==a[id[x]].ask(l)&&i<id[x]))updata(lc,l,mid,i);
		if(a[i].ask(r)-a[id[x]].ask(r)>eps||(a[i].ask(r)==a[id[x]].ask(r)&&i<id[x]))updata(rc,mid+1,r,i);
	}
	inline double query(int x,int l,int r,int k)
	{
		double res=0;
		if(id[x])res=a[id[x]].ask(k);
		if(l==r)return res;
		if(k<=mid)res=max(res,query(lc,l,mid,k));
		else res=max(res,query(rc,mid+1,r,k));
	}
}tree;
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		string opt;
		cin>>opt;
		if(opt=="Query")
		{
			int t;
			scanf("%lld",&t);
			printf("%lld\n",(int)tree.query(1,1,50010,t)/100);
		}
		else
		{
			double s,p;
			scanf("%lf%lf",&s,&p);
			cnt++;
			a[cnt].b=s;
			a[cnt].k=p;
			tree.updata(1,1,50010,cnt);
		}
	}
	return 0;
}
2024/9/2 23:51
加载中...