• luogu P4848 崂山白花蛇草水


    https://www.luogu.org/problemnew/show/P4848

    我的数据结构大概已经废了。

    外层权值线段树内层kdtree,外层线段树上二分答案。

    码数据结构一时爽,码完debug火葬场。

    要rebuild时少写了个else什么的

    插入不upd下去的时候没把值更新完比如sz什么的

    比较Int的时候把外层数组套多套少什么的

    拿什么拯救你,我的数据结构

    吸氧才能过的代码,据说没人能不吸氧过。

    //Achen
    #include<bits/stdc++.h>
    #define For(i,a,b) for(int i=(a);i<=(b);i++)
    #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
    #define Formylove return 0
    const int N=100007,UP=1e9;
    typedef long long LL; 
    typedef double db;
    using namespace std;
    int n,q,lastans;
    int xl,yl,xr,yr,Qrs;
    
    template<typename T> void read(T &x) {
        char ch=getchar(); x=0; T f=1;
        while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
        if(ch=='-') f=-1,ch=getchar();
        for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    #define lc ch[x][0]
    #define rc ch[x][1]
    #define mid ((l+r)>>1)
    
    struct pt {
    	int d[2],v;
    }p[N*33];
    int rt[N*33],cnt,dt[N*33][2][2],ch[N*33][2],sz[N*33],f[N*33],D;
    
    void upd(int x) {
    	dt[x][0][0]=dt[x][0][1]=p[x].d[0];
    	dt[x][1][0]=dt[x][1][1]=p[x].d[1];
    	if(lc) {
    		dt[x][0][0]=min(dt[x][0][0],dt[lc][0][0]);
    		dt[x][0][1]=max(dt[x][0][1],dt[lc][0][1]);
    		dt[x][1][0]=min(dt[x][1][0],dt[lc][1][0]);
    		dt[x][1][1]=max(dt[x][1][1],dt[lc][1][1]);
    	}
    	if(rc) {
    		dt[x][0][0]=min(dt[x][0][0],dt[rc][0][0]);
    		dt[x][0][1]=max(dt[x][0][1],dt[rc][0][1]);
    		dt[x][1][0]=min(dt[x][1][0],dt[rc][1][0]);
    		dt[x][1][1]=max(dt[x][1][1],dt[rc][1][1]);
    	}
    	sz[x]=sz[lc]+sz[rc]+1;
    }
    	
    int sta[N],top;
    void tra(int x) {
    	if(lc) tra(lc);
    	sta[++top]=x;
    	if(rc) tra(rc);
    }
    	
    bool cmp(const int &A,const int &B) { return p[A].d[D]<p[B].d[D]; }
    	
    int build(int l,int r,int dd) {
    	D=dd;
    	if(l>r) return 0;
    	nth_element(sta+l,sta+mid,sta+r+1,cmp);
    	int x=sta[mid];
    	lc=build(l,mid-1,dd^1); if(lc) f[lc]=x; 
    	rc=build(mid+1,r,dd^1); if(rc) f[rc]=x;
    	upd(x); return x;
    }
    	
    int rebuild(int x,int F,int dd) {
    	top=0; tra(x);
    	int rs=build(1,top,dd); 
    	f[rs]=F; return rs;
    }
    	
    int bal(int x) { return sz[x]*0.85>=max(sz[lc],sz[rc]); }
    	
    void insert(int &RT,pt A) {
    	int x=RT;
    	for(int fa=0,l=0,dd=0;;dd^=1) {
    		if(!x) {
    			x=++cnt; p[x]=A; 
    			upd(x);
    			f[x]=fa;
    			if(fa) ch[fa][l]=x;
    			else RT=x;
    			break ;
    		}
    		dt[x][0][0]=min(dt[x][0][0],A.d[0]);
    		dt[x][0][1]=max(dt[x][0][1],A.d[0]);
    		dt[x][1][0]=min(dt[x][1][0],A.d[1]);
    		dt[x][1][1]=max(dt[x][1][1],A.d[1]); sz[x]++;
    		if(A.d[dd]<p[x].d[dd]) fa=x,x=lc,l=0;
    		else fa=x,x=rc,l=1;
    	}
    	int ls=-1,dd=0,lsd;
    	for(int tp=x;;tp=f[tp],dd^=1) {
    		if(!bal(tp)) ls=tp,lsd=dd;
    		if(tp==RT) break;
    	} 
    	if(ls!=-1) {
    		if(ls==RT) RT=rebuild(ls,0,0); 
    		else ch[f[ls]][ls==ch[f[ls]][1]]=rebuild(ls,f[ls],lsd^dd);
    	}
    }
    	
    void qry(int x) {
    	if(!x) return ;
    	if(dt[x][0][0]>xr||dt[x][0][1]<xl||dt[x][1][0]>yr||dt[x][1][1]<yl) return;
    	if(dt[x][0][0]>=xl&&dt[x][0][1]<=xr&&dt[x][1][0]>=yl&&dt[x][1][1]<=yr) {
    		Qrs+=sz[x]; return ;
    	}
    	if(p[x].d[0]>=xl&&p[x].d[0]<=xr&&p[x].d[1]>=yl&&p[x].d[1]<=yr) Qrs++;
    	if(lc) qry(lc); if(rc) qry(rc);
    }
    
    int sgrt,tot,lson[N*33],rson[N*33];
    void upd(int &x,int l,int r,int pos,pt A) {
    	if(!x) x=++tot; insert(rt[x],A);
    	if(l==r) return ;
    	if(pos<=mid) upd(lson[x],l,mid,pos,A);
    	else upd(rson[x],mid+1,r,pos,A);
    }
    
    int qry(int x,int l,int r,int k) {
    	Qrs=0; 
    	if(l==r) { 
    		qry(rt[x]);
    		if(Qrs>=k) return l;
    		else return 0; 
    	}
    	qry(rt[rson[x]]);
    	if(Qrs>=k) return qry(rson[x],mid+1,r,k);
    	else return qry(lson[x],l,mid,k-Qrs);
    }
    
    int main() {
    	//freopen("4605.in","r",stdin);
    	//freopen("4605.out","w",stdout);
    	read(n); read(q);
    	For(i,1,q) {
    		int o;
    		read(o);
    		if(o==1) {
    			int x,y,v;
    			read(x); read(y); read(v);
    			x^=lastans; y^=lastans; v^=lastans;
    			upd(sgrt,1,UP,v,(pt){x,y,v});
    		}
    		else {
    			int k;
    			read(xl); read(yl); read(xr); read(yr);
    			xl^=lastans; yl^=lastans;
    			xr^=lastans; yr^=lastans;
    			read(k); k^=lastans;
    			lastans=qry(sgrt,1,UP,k);
    			if(!lastans) puts("NAIVE!ORZzyz.");
    			else printf("%d
    ",lastans);
    		}
    	}
        Formylove;
    }
    
    //Achen
    #include<bits/stdc++.h>
    #define For(i,a,b) for(int i=(a);i<=(b);i++)
    #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
    #define Formylove return 0
    const int N=5005;
    typedef long long LL;
    typedef double db;
    using namespace std;
    int a[N][N];
    
    template<typename T> void read(T &x) {
        char ch=getchar(); T f=1; x=0;
        while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
        if(ch=='-') f=-1,ch=getchar();
        for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    int main() {
        //freopen("1.in","w",stdout);
        srand(time(0));
        int n=10,m=rand()%100+1;
        printf("%d %d
    ",n,m);
        For(i,1,m) {
            int o;
            o=rand()%2+1;
            //if(i<=m/2) o=1; else o=2;
            if(i<=5) {
                int x=rand()%n+1,y=rand()%n+1,v=rand()%10+1;
                printf("1 %d %d %d
    ",x,y,v);
            }    
            else {
                int xl,yl,xr,yr,k;
                xl=rand()%n+1,xr=rand()%n+1;
                yl=rand()%n+1,yr=rand()%n+1;
                if(xl>xr) swap(xl,xr);
                if(yl>yr) swap(yl,yr);
                k=rand()%n+1;
                printf("2 %d %d %d %d %d
    ",xl,yl,xr,yr,k);
            }
        }
        Formylove;
    }
    View Code
  • 相关阅读:
    npm命令
    前端单元测试工具karma和jest
    加解密学习之--模运算与经典密码学
    数据结构之-翻转二叉树
    数据结构之-链表倒转
    转载:MQ
    分布式ID生成器 待整理
    软件开发中的负载均衡
    制作软件过程中所产出的文档(请补充)
    多线程的创建
  • 原文地址:https://www.cnblogs.com/Achenchen/p/10410811.html
Copyright © 2020-2023  润新知