神奇 C++& 警示后人
查看原帖
神奇 C++& 警示后人
982681
D0000楼主2024/7/15 21:57

我一开始代码里面有几个错误,但是也许 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 就过了。

希望能帮到大家!

2024/7/15 21:57
加载中...