D0000 @ 2024-07-15 21:57:14
我一开始代码里面有几个错误,但是也许 Subtask #0 太水了,居然过了好几个点,然后神奇的事情发生了:
同一份代码:
#include<cstdio>
#include<algorithm>
int n,lastans,cnt=0;
struct seg{
int x0,y0,x1,y1;
double aa,bb;
int id;
void in(int x){
scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
x0=((x0+lastans-1)%39989)+1;
x1=((x1+lastans-1)%39989)+1;
y0=((y0+lastans-1)%1000000000)+1;
y1=((y1+lastans-1)%1000000000)+1;
id=x;
if(x0==x1){
if(y0>y1)y1=y0;
aa=0,bb=y1;
return;
}
aa=1.0*(y1-y0)/(x1-x0);
bb=y0-aa*x0;
if(x0>x1){
int yyy=x0;
x0=x1;
x1=yyy;
}
}
};
struct node{
seg tag;
}sgt[400000];
void build(int l=1,int r=39989,int o=1){
seg zyh;
zyh.id=0;
zyh.x0=l,zyh.x1=r;
zyh.y0=zyh.y1=0;
zyh.aa=zyh.bb=0;
sgt[o].tag=zyh;
if(l==r)return;
else{
int mid=(l+r)>>1;
build(l,mid,o*2);
build(mid+1,r,o*2+1);
}
}
double jisuan(seg zyh,int xxx){
return zyh.aa*xxx+zyh.bb;
}
void push_down(seg zyh,int l,int r,int o){
int mid=(l+r)>>1;
if(jisuan(zyh,mid)>jisuan(sgt[o].tag,mid)||(jisuan(zyh,mid)==jisuan(sgt[o].tag,mid)&&sgt[o].tag.id>zyh.id)){
seg ddx=zyh;
zyh=sgt[o].tag;
sgt[o].tag=ddx;
}
if(jisuan(zyh,l)<=jisuan(sgt[o].tag,l)&&jisuan(zyh,r)<=jisuan(sgt[o].tag,r))return;
if(jisuan(zyh,l)<=jisuan(sgt[o].tag,l))push_down(zyh,mid+1,r,o*2+1);
else push_down(zyh,l,mid,o*2);
}
void add(seg zyh,int l=1,int r=39989,int o=1){//printf("(%d,%d)",l,r);
if(zyh.x0<=l&&zyh.x1>=r){
push_down(zyh,l,r,o);
return;
}
int mid=(l+r)>>1;
if(zyh.x0<=mid)add(zyh,l,mid,o*2);
if(zyh.x1>mid)add(zyh,mid+1,r,o*2+1);
}
seg qu(int xx,int l=1,int r=39989,int o=1){
seg maxx,dhx;
maxx.aa=sgt[o].tag.aa*xx+sgt[o].tag.bb,maxx.id=sgt[o].tag.id;
if(l==r)return maxx;
int mid=(l+r)>>1;
if(xx<=mid)dhx=qu(xx,l,mid,o*2);
else dhx=qu(xx,mid+1,r,o*2+1);
if(dhx.aa*xx+dhx.bb>maxx.aa)maxx.aa=dhx.aa*xx+dhx.bb,maxx.id=dhx.id;
return maxx;
}
int main(){
scanf("%d",&n);
build();
while(n--){
int op,x;
seg zyh;
scanf("%d",&op);
if(op==0){
scanf("%d",&x);
x=((x+lastans-1)%39989)+1;
lastans=qu(x).id;
printf("%d\n",lastans);
}
else{
zyh.in(++cnt);
add(zyh);
}
}
}
C++ 11(O2):AC 4
C++ 14 (GCC) (O2) :AC 6
C++ 14 (GCC) :AC 7(全部 Subtask #0)
这个题 Subtask #0 太水了,向我这种有大问题的代码都能过。所以哪怕全部过了也不要掉以轻心,检查代码里有没有细节问题。
最后,我 WA 了 #5。然后加了句 #define double long double
就过了。
希望能帮到大家!