所有测试点全部 RE ( 包括样例 )
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
const int maxn=500005;
const int m=500000;
int n;
struct node{
int l;
int r;
double k;
double b;
}t[4*maxn];
inline void push_up(int x,double k,double b){
t[x].k=k;
t[x].b=b;
}
inline void build_tree(int x,int l,int r){
t[x].l=l;
t[x].r=r;
if(l==r){
t[x].k=t[x].b=0;
return;
}
int mid=(t[x].l+t[x].r)>>1;
int left_x=2*x;
int right_x=2*x+1;
build_tree(left_x,l,mid);
build_tree(right_x,mid+1,r);
}
inline void update_tree(int x,int l,int r,double k,double b){
int mid=(t[x].l+t[x].r)>>1;
int left_x=2*x;
int right_x=2*x+1;
if(l<=t[x].l&&r>=t[x].r){
double x0=t[x].l;
double x1=t[x].r;
double y0p=t[x].k*x0+t[x].b;
double y1p=t[x].k*x1+t[x].b;
double y0=k+x0+b;
double y1=k+x1+b;
if(y0>=y0p&&y1>=y1p) push_up(x,k,b);
else if(y0>=y0p&&y1<=y1p) return;
else{
double mi=(x0+x1)/2.0;
double sec=(b-t[x].b)/(t[x].k-k);
if(y0>y0p){
if(sec<=mi) update_tree(left_x,l,r,k,b);
else{
update_tree(right_x,l,r,t[x].k,t[x].b);
push_up(x,k,b);
}
}
else{
if(sec<=mi){
update_tree(left_x,l,r,t[x].k,t[x].b);
push_up(x,k,b);
}
else update_tree(right_x,l,r,k,b);
}
}
}
if(l<=mid) update_tree(left_x,l,r,k,b);
if(r>mid) update_tree(right_x,l,r,k,b);
}
inline double query_tree(int x,int p,double ans){
ans=max(t[x].k*(1.0*p)+t[x].b,ans);
if(t[x].l==t[x].r) return ans;
int mid=(t[x].l+t[x].r)>>1;
int tot=0;
int left_x=2*x;
int right_x=2*x+1;
if(p<=mid) tot=query_tree(left_x,p,ans);
else tot=query_tree(right_x,p,ans);
return tot;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin>>n;
build_tree(1,1,m);
while(n--){
string opt;
cin>>opt;
if(opt=="Project"){
double s,k,b;
cin>>s>>k;
b=s-k;
update_tree(1,1,m,k,b);
}
else if(opt=="Query"){
int x;
int ans;
cin>>x;
ans=(int)(query_tree(1,x,0)/100.0);
cout<<ans<<"\n";
}
}
return 0;
}
样例都过不了,但可由样例情况得知update_tree函数中有错误,其余错误未知
救救孩子吧,我只是个新六年级的蒟蒻