bzoj4066: 简单题 K-Dtree
bzoj4066: 简单题
链接
思路
强制在线。k-dtree。
卡常啊。空间开1e6就T了。
代码
#include <bits/stdc++.h>
#define my_min(a,b) (a<b?a:a=b)
#define my_max(a,b) (a>b?a:a=b)
using namespace std;
const double alpha=0.75;
const int N=2e5+7;
int read() {
	int x=0,f=1;
	char s=getchar();
	for(; s>'9'||s<'0'; s=getchar()) if(s=='-') f=-1;
	for(; s>='0'&&s<='9'; s=getchar()) x=x*10+s-'0';
	return x*f;
}
int WD,lastans;
struct point {
	int x[2],v;
	bool operator < (const point &b) const {
		return x[WD]<b.x[WD];
	}
} p[N];
struct node {
	int ls,rs,mi[2],ma[2],sum,siz;
	point a;
} e[N];
int rub[N],top,cnt;
int newnode() {
	if(top) return rub[top--];
	return ++cnt;
}
void update(int x,int y) {
	my_min(e[x].mi[0],e[y].mi[0]);
	my_min(e[x].mi[1],e[y].mi[1]);
	my_max(e[x].ma[0],e[y].ma[0]);
	my_max(e[x].ma[1],e[y].ma[1]);
}
void up(int u) {
	int ls=e[u].ls,rs=e[u].rs;
	e[u].mi[0]=e[u].ma[0]=e[u].a.x[0];
	e[u].mi[1]=e[u].ma[1]=e[u].a.x[1];
	e[u].sum=e[ls].sum+e[rs].sum+e[u].a.v;
	e[u].siz=e[ls].siz+e[rs].siz+1;
	if(ls) update(u,ls);
	if(rs) update(u,rs);
}
int build(int l,int r,int wd) {
	if(l>r) return 0;
	int mid=(l+r)>>1;
	WD=wd;
	nth_element(p+l,p+mid,p+r+1);
	int u=newnode();
	e[u].a=p[mid];
	e[u].ls=build(l,mid-1,wd^1);
	e[u].rs=build(mid+1,r,wd^1);
	up(u);
	return u;
}
void pia(int u,int num) {
	if(e[u].ls) pia(e[u].ls,num);
	p[num+e[e[u].ls].siz+1]=e[u].a;
	rub[++top]=u;
	if(e[u].rs) pia(e[u].rs,num+e[e[u].ls].siz+1);
}
int check(int &u,int wd) {
	if(alpha*e[u].siz<e[e[u].ls].siz||alpha*e[u].siz<e[e[u].rs].siz)
		pia(u,0),u=build(1,e[u].siz,wd);
}
void insert(point a,int &rt,int wd) {
	if(!rt) {
		rt=newnode();
		e[rt].a=a;
		e[rt].ls=e[rt].rs=0;
		up(rt);
		return;
	}
	if(e[rt].a.x[wd]<a.x[wd]) insert(a,e[rt].rs,wd^1);
	else insert(a,e[rt].ls,wd^1);
	up(rt);
	check(rt,wd);
}
int pd(node a,int x,int y,int X,int Y) {
	if(x<=a.mi[0]&&a.ma[0]<=X&&y<=a.mi[1]&&a.ma[1]<=Y) return 1;
	if(a.ma[0]<x||X<a.mi[0]) return 0;
	if(a.ma[1]<y||Y<a.mi[1]) return 0;
	return 2;
}
void query(int rt,int x,int y,int X,int Y) {
	if(x<=e[rt].a.x[0]&&e[rt].a.x[0]<=X
	        &&y<=e[rt].a.x[1]&&e[rt].a.x[1]<=Y) lastans+=e[rt].a.v;
	int ls=e[rt].ls,rs=e[rt].rs;
	if(ls) {
		int PD=pd(e[ls],x,y,X,Y);
		if(PD==1) lastans+=e[ls].sum;
		if(PD==2) query(ls,x,y,X,Y);
	}
	if(rs) {
		int PD=pd(e[rs],x,y,X,Y);
		if(PD==1) lastans+=e[rs].sum;
		if(PD==2) query(rs,x,y,X,Y);
	}
}
int main() {
	int rt=0,n=read();
	while(233) {
		int opt=read();
		if(opt==1) {
			point a;
			a.x[0]=read()^lastans,a.x[1]=read()^lastans,a.v=read()^lastans;
			insert(a,rt,0);
		} else if(opt==2) {
			int x=read()^lastans,y=read()^lastans,X=read()^lastans,Y=read()^lastans;
			lastans=0;
			query(rt,x,y,X,Y);
            printf("%d\n",lastans);
		} else break;
	}
	return 0;
}
bzoj4066: 简单题 K-Dtree的更多相关文章
- [BZOJ2683][BZOJ4066]简单题
		[BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ... 
- Bzoj4066 简单题
		Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ... 
- BZOJ4066 简单题(KD-Tree)
		板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ... 
- BZOJ4066:简单题(K-D Tree)
		Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ... 
- 【kd-tree】bzoj4066 简单题
		同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ... 
- [bzoj4066/2683]简单题_KD-Tree
		简单题 bzoj-4066 题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线. 注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdo ... 
- 【BZOJ4066】简单题(KD-Tree)
		[BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ... 
- 【BZOJ4066】简单题 KDtree
		[BZOJ4066]简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ... 
- Bzoj2683 简单题
		Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1071 Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ... 
随机推荐
- MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)
			一.數據表 是參照 別人的庫建表的 ,主鍵都是用int 自增,若是跨數據庫的話,建議使用GUID為主鍵. 
- 在Unity 5中优化SkinnedMeshRenderer
			过早优化是万恶之源”——Donald Knuth 不少开发者在前期开发过程中对算法等类似的开销都甚少关心,而是更倾向于尽可能简单的解决某个问题,后面必要时再进行优化.这能极大加速开发进度 ... 
- C# ThreadStart中如何带参数
			1.ThreadStart 线程执行带参数的方法,new Thread(new ThreadStart(delegate { ThreadTask(firstPage, lastPage); })); ... 
- wangeditor视频
			wangeditor网址http://www.wangeditor.com/ 目前使用的是3.11版本 使用步骤 1.引用wangEditor.min.js 2.代码 2.1 取得函数var E = ... 
- 如何在ppt全屏演示时仍然显示任务栏?
			相信做过ppt演讲的人会有这样的体会:有的时候希望全屏ppt时不要直接霸占全部的屏幕,至少希望能够看到任务栏,这样就可以仍然方便切换程序. 如何实现呢? 很简单,看下图吧:) https://www. ... 
- redis设计与实现(一)简单动态字符串
			redis是C语言实现的,但redis中的字符串并没有直接用C语言中的字符串表示,而是自己构建了一种简单的动态字符串类型(SDS). 在redis里面,C字符串只用作字面量,用在一些不会修改的地方,e ... 
- this、对象原型
			this和对象原型 第一章 关于this 1.1 为什么要用this this 提供了一种更优雅的方式来隐式"传递"一个对象引用,因此可以将 API 设计 得更加简洁并且易于复用. ... 
- node.js中的fs.rename()方法
			node.js 中的fs.rename()模块 var fs=require('fs');//node.js的核心模块 原生模块.修改文件名称,可更改文件的存放路径 方法说明 : 修改文件名称,可更改 ... 
- 英语gzibeads天珠gzibeads单词
			天珠英语是gZiBeads,藏语叫(si , 斯)汉语译为“斯”或“瑟”,又称“天降石”.在<藏汉大辞典>里天珠的解释为:“亚玛瑙,猫睛石,一种宝石,俗称九眼珠.入药能治脑溢血”.最早的天 ... 
- python高级编程之 web静态服务器
			返回固定数据 import socket def request_handler(new_client_socket): """ 响应客户端请求的核心函数 "& ... 
