• BZOJ 3165: [Heoi2013]Segment


    超哥线段树

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int lim=39989;
    const int Mod=1e9;
    int ansid,ANS[2000005],Max[100005],Maxid[100005];
    double ans;
    struct node{
    	double k,b;
    }Line[2000005];
    inline double check(node a,node b){
    	return (a.b-b.b)/(b.k-a.k);
    }
    inline double calc(double x,node line){
    	return line.k*x+line.b;
    }
    inline void update(int t,node line,int ID){
    	Line[t]=line,ANS[t]=ID;
    }
    inline void insert(int t,int l,int r,int x,int y,node line,int ID){
    	if (l>y || r<x) return;
    	if (l>=x && r<=y){
    		double Lmax=calc(l,line),Rmax=calc(r,line);
    		double Lt=calc(l,Line[t]),Rt=calc(r,Line[t]);
    		if (Lmax<=Lt && Rmax<=Rt) return;
    		else if (Lmax>Lt && Rmax>Rt) update(t,line,ID);
    		else{
    			int mid=(l+r)>>1;
    			double Key=check(line,Line[t]);
    			node To=line;
    			int Toid=ID;
    			if (Key<=mid) {
    				if (Lmax<Lt) {
    					To=Line[t],Toid=ANS[t];
    					update(t,line,ID);
    				}
    				insert(t<<1,l,mid,x,y,To,Toid);
    			}
    			else {
    				if (Rmax<Rt){
    					To=Line[t],Toid=ANS[t];
    					update(t,line,ID);
    				}
    				insert(t<<1|1,mid+1,r,x,y,To,Toid);
    			}
    		}
    		return;
    	}
    	int mid=(l+r)>>1;
    	insert(t<<1,l,mid,x,y,line,ID);
    	insert(t<<1|1,mid+1,r,x,y,line,ID);
    }
    void query(int t,int l,int r,int key){
    	double Key=calc(key,Line[t]);
    	if (Key>ans || (Key==ans && ANS[t]<ansid)) ans=Key,ansid=ANS[t];
    	if (l==r) return;
    	int mid=(l+r)>>1;
    	if (key<=mid) query(t<<1,l,mid,key);
    	else query(t<<1|1,mid+1,r,key);
    }
    int main(){
    	int q;
    	scanf("%d",&q);
    	int Lastans=0,Num=0;
    	for (int i=1; i<=lim; i++) Max[i]=-1e9;
    	while (q--){
    		int cas;
    		scanf("%d",&cas);
    		if (!cas){
    			int X;
    			scanf("%d",&X);
    			X=(X+Lastans-1)%lim+1;
    			ans=ansid=0;
    			query(1,1,lim,X);
    			if (Max[X]>ans || (Max[X]==ans && Maxid[X]<ansid)) ans=Max[X],ansid=Maxid[X];
    			Lastans=ansid;
    			printf("%d
    ",Lastans);
    		}
    		else{
    			int x0,y0,x1,y1;
    			scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
    			x0=(x0+Lastans-1)%lim+1,y0=(y0+Lastans-1)%Mod+1;
    			x1=(x1+Lastans-1)%lim+1,y1=(y1+Lastans-1)%Mod+1;
    			if (x0>x1) swap(x0,x1),swap(y0,y1);
    			Num++;
    			if (x0==x1){
    				int val=max(y0,y1);
    				if (val>Max[x0]) Max[x0]=val,Maxid[x0]=Num;
    			}
    			else{
    				double K=((double)y1-y0)/(x1-x0);
    				double B=y0-x0*K;
    				insert(1,1,lim,x0,x1,(node){K,B},Num);
    			}
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Python学习————作业
    Python学习————前端
    Python学习————前端(JS)
    Python————前端
    Python学习————作业(简单页面设计)
    Python学习————前端(注册)
    Python学习————表格与表单
    Python学习————作业(前端)
    Python学习————前端
    51Nod1307 绳子与重物
  • 原文地址:https://www.cnblogs.com/silenty/p/9842390.html
Copyright © 2020-2023  润新知