当前位置: 首页 > news >正文

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\n",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",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\n",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\n",xl,yl,xr,yr,k);
        }
    }
    Formylove;
}
View Code

 

转载于:https://www.cnblogs.com/Achenchen/p/10410811.html

相关文章:

  • idou老师教你学Istio 26:如何使用Grafana进行可视化监控
  • RHEL4- WEB服务(十一)apache服务器日志的压缩、回滚
  • 你的知识,价值几何?
  • os.path.dirname使用方法
  • NetBeans 时事通讯(刊号 # 66 - Jul 30, 2009)
  • Android Studio Fragment 无法获取 id的方法
  • 信息安全的理解和全局对策转
  • HDU 1276
  • 注册表
  • 6.1
  • [转]gridview获取当前行索引的方法
  • 29-算法训练 结点选择-超时了!!!
  • 父子进程---exec
  • Python字符串大小写转化
  • jqgrid表格内状态条
  • 【Amaple教程】5. 插件
  • Apache的80端口被占用以及访问时报错403
  • ECS应用管理最佳实践
  • input的行数自动增减
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JS题目及答案整理
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux链接文件
  • Mysql5.6主从复制
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vue学习第二天
  • 聚类分析——Kmeans
  • 前嗅ForeSpider采集配置界面介绍
  • 自动记录MySQL慢查询快照脚本
  • Spring Batch JSON 支持
  • zabbix3.2监控linux磁盘IO
  • #pragma预处理命令
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (windows2012共享文件夹和防火墙设置
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (一) storm的集群安装与配置
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)VC++中ondraw在什么时候调用的
  • (转)母版页和相对路径
  • ****Linux下Mysql的安装和配置
  • .NET 8.0 发布到 IIS
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net Redis的秒杀Dome和异步执行
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 指南:抽象化实现的基类
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .netcore如何运行环境安装到Linux服务器
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Data注解的作用