bzoj2683bzoj4066

题解:

前一题不是强制在线,后一题是强制在线

树套树空间会炸

说一下cdq分治+树状数组

首先我们利用cdq分治使得查询和操作保证先后关系

然后矩阵查询变成4个矩阵的差

那么我们就可以运用扫描线的方法来维护了

时间nlogn^2,空间O(n)

后一题是kd-tree

查询的方法和线段树基本一样

如果矩阵被包含就返回答案,如果不被包含就直接退出

否则递归下去

然后修改的话和替罪羊树一样

达到一定时候就重构

注意一下x相同insert和build要保证y的顺序区分左右

另外学习了一下map中用struct作为key的方法 虽然这题完全不用用

代码:

 

#include <bits/stdc++.h>
using namespace std;
#define rint register int 
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define mid ((h+t)/2)
#define me(x) memset(x,0,sizeof(x))
const int INF=2e9;
const int N=6e6+1e4;
char ss[1<<24],*A=ss,*B=ss;
IL char gc()
{return A==B&&(B=(A=ss)+fread(ss,1,1<<24,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{rint f=1,c; while (c=gc(),c<48||c>57) if (c=='-') f=-1; x=(c^48);while (c=gc(),c>47&&c<58) x=(x<<3)+(x<<1)+(c^48); x*=f;
}
IL void umax(int &x,int y)
{if (x<y) x=y;
}
IL void umin(int &x,int y)
{if (x>y) x=y;
}
struct re{int d[2],v;
}p[N];
int cmp_d,ans,rt,num;
bool cmp(re x,re y)
{return x.d[cmp_d]<y.d[cmp_d]||(x.d[cmp_d]==y.d[cmp_d]&&x.d[cmp_d^1]<y.d[cmp_d^1]);
}
struct kd
{int Mx[N],My[N],Nx[N],Ny[N],count2[N],ls[N],rs[N];IL void clear(){me(count2);me(ls); me(rs);}IL void updata(int x){count2[x]=count2[ls[x]]+count2[rs[x]]+p[x].v;if (ls[x]){umax(Mx[x],Mx[ls[x]]);umax(My[x],My[ls[x]]);umin(Nx[x],Nx[ls[x]]);umin(Ny[x],Ny[ls[x]]);}if (rs[x]){umax(Mx[x],Mx[rs[x]]);umax(My[x],My[rs[x]]);umin(Nx[x],Nx[rs[x]]);umin(Ny[x],Ny[rs[x]]);}}int build(int h,int t,int o){cmp_d=o; nth_element(p+h,p+mid,p+t+1,cmp);int x=mid;Mx[x]=Nx[x]=p[x].d[0];My[x]=Ny[x]=p[x].d[1];count2[x]=p[x].v;if (h!=x) ls[x]=build(h,mid-1,o^1); else ls[x]=0;if (x!=t) rs[x]=build(mid+1,t,o^1); else rs[x]=0;updata(x);return x; }void insert(int &k,int x,int y,int z,int o){if (!k){k=++num;Mx[num]=Nx[num]=p[num].d[0];My[num]=Ny[num]=p[num].d[1];count2[num]=p[num].v=z;return;}if (p[k].d[0]==x&&p[k].d[1]==y){count2[k]+=z; p[k].v+=z; return;}if (!o)if (x<p[k].d[0]||(x==p[k].d[0]&&y<p[k].d[1])) insert(ls[k],x,y,z,o^1);else insert(rs[k],x,y,z,o^1);else if (y<p[k].d[1]||(y==p[k].d[1]&&x<p[k].d[0])) insert(ls[k],x,y,z,o^1);else insert(rs[k],x,y,z,o^1); updata(k);}void query(int k,int x1,int x2,int y1,int y2){if (!k||Mx[k]<x1||Nx[k]>x2||My[k]<y1||Ny[k]>y2) return;if (x2>=Mx[k]&&Nx[k]>=x1&&y2>=My[k]&&Ny[k]>=y1){ans+=count2[k]; return;}if (x1<=p[k].d[0]&&p[k].d[0]<=x2&&y1<=p[k].d[1]&&p[k].d[1]<=y2)ans+=p[k].v;query(ls[k],x1,x2,y1,y2); query(rs[k],x1,x2,y1,y2);}
}kd;
struct re1{int a,b;
};
struct cmp2
{bool operator() (const re1 x,const re1 y){if (x.a<y.a||(x.a==y.a&&x.b<y.b)) return(1); else return(0);}
};
map<re1,int,cmp2> M;
int main()
{int m;freopen("1.in","r",stdin);freopen("1.out","w",stdout);read(m);int cnt=0,rt=0,i=0;while (1){i++;ans=0;int k;read(k);if (k==3) break;if (k==1){int x,y,z;read(x); read(y); read(z);x^=ans; y^=ans; z^=ans;re1 k3=(re1){x,y};int kk=M[k3];if (!kk) p[num+1].d[0]=x,p[num+1].d[1]=y,kk=num+1;M[k3]=kk;kd.insert(rt,x,y,z,0);cnt++;if (cnt%10000==0){ kd.clear();rt=kd.build(1,num,0);} } else{int x1,x2,y1,y2;read(x1),read(y1),read(x2),read(y2);x1^=ans,x2^=ans,y1^=ans,y2^=ans;ans=0;kd.query(rt,x1,x2,y1,y2);cout<<ans<<endl;}}return 0; 
}

 

转载于:https://www.cnblogs.com/yinwuxiao/p/9288414.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[vue] 跟keep-alive有关的生命周期是哪些?描述下这些生命周期

[vue] 跟keep-alive有关的生命周期是哪些&#xff1f;描述下这些生命周期 activated和deactivatedkeep-alive的生命周期1.activated&#xff1a; 页面第一次进入的时候&#xff0c;钩子触发的顺序是created->mounted->activated2.deactivated: 页面退出的时候会触发deac…

[vue] 如果现在让你从vue/react/angularjs三个中选择一个,你会选哪个?说说你的理由

[vue] 如果现在让你从vue/react/angularjs三个中选择一个&#xff0c;你会选哪个&#xff1f;说说你的理由 让我选肯定是vue。angularjs没用过。angular倒是用过。挺好用的&#xff0c;但是&#xff01;&#xff01;&#xff01;编译真的很慢&#xff0c;加了热更新还是慢&…

微信小程序 - 用户进入客服会话会在右下角显示可能要发送的小程序提示

起因&#xff0c;看到了抽奖小助手的操作&#xff0c;如下截图 我就想 我去 这个吊啊 很懵逼 因为之前没见过 以为是服务端的操作 看了半天服务端文档并没有相关介绍&#xff0c;在微信社区遨游了半天发现了 原来就是小程序「buttun」组件新增&#xff08;之前看的时候 明明没…

java中boolean类型占几个字节

java的基本数据类型中&#xff0c;boolean只有两种状态&#xff0c;默认值为false.取值范围是{true,false}&#xff0c;理论上占1bit&#xff0c;实际上&#xff1a; 1.单个的boolean 类型变量在编译的时候是使用的int 类型。 boolean atrue;//这个a在JVM中占4个字节即&#xf…

[vue] 你知道vue2.0兼容IE哪个版本以上吗?

[vue] 你知道vue2.0兼容IE哪个版本以上吗&#xff1f; 双向绑定的原理是基于Object,defineProperty的&#xff0c;ie8及以下不兼容这个api。另外还有一些特性至少在ie10才能用&#xff0c;我们已经弃用ie了&#xff0c;所以没继续总结个人简介 我是歌谣&#xff0c;欢迎和大家…

小程序真机测试「启动参数」解析出错问题

写小程序2年了 前两天才碰到的这个问题 以前没出错过 话不多说 直接上图 1、小程序 - 启动参数图例 2 2、微信开发者工具-模拟器输出参数-正常图例 这是没问题&#xff01; 3、真机测试-输出参数-错误图例 也不知道是什么原因 去看了一下文档 「启动参数」传参的规则并没有改…

质数

1117: 质数 时间限制: 1 Sec 内存限制: 128 MB提交: 6 解决: 3[提交][状态][讨论版][命题人:外部导入]题目描述 给定一个长度为N(0< n< 10000)的序列&#xff0c;保证每一个序列中的数字a[i]是小于maxlongint的非负整数 &#xff0c;编程要求求出整个序列中第k大的数字…

[vue] 使用vue开发一个todo小应用,谈下你的思路

[vue] 使用vue开发一个todo小应用&#xff0c;谈下你的思路 结构: 输入部分( input )和输出部分( ul ) 逻辑:用户输入之后,通过事件触发拿到用户输入的数据存起来, 将用户数据集合通过 v-for 渲染到页面上 当用户点击清单项,通过事件触发移出对应事件个人简介 我是歌谣&#…

和的区别

1、都可用作「逻辑与运算符」 &和&&用作「逻辑与运算符」时&#xff0c;当运算符两边的表达式的结果都为true时&#xff0c;整个运算结果才为true&#xff0c;否则&#xff0c;只要有一方为false&#xff0c;则结果为false。在JS中&#xff0c;一共有这几种情况被认…

[vue] 你有看过vue推荐的风格指南吗?列举出你知道的几条

[vue] 你有看过vue推荐的风格指南吗&#xff1f;列举出你知道的几条 优先级A的规则&#xff1a;必要的 &#xff08;规避错误&#xff09;组件名为多个单词组件数据&#xff1a;组件的 data 必须是一个函数。细致的 Prop 定义总是用 :key 配合 v-for避免 v-if 和 v-for 用在一起…

jQuery学习总结06-插件开发

本文是参考了Joey的博客后整理的。 先从一个简单扩展jQuery对象的demo开始说起&#xff1a; //sample:扩展jquery对象的方法&#xff0c;redTextColor()用于改变字体颜色。(function ($) {$.fn.extend({"redTextColor": function () {// 默认字体颜色为红色return th…

js 位运算符 ~, ,| ,^

1、位运算 NOT 由否定号&#xff08;~&#xff09;表示 位运算 NOT 是三步的处理过程&#xff1a; 把运算数转换成 32 位数字把二进制数转换成它的二进制反码把二进制数转换成浮点数 例如&#xff1a; //31位表示整数的数值&#xff0c;用第 32 位表示整数的符号&#xff0c;…

[vue-cli]vue-cli提供了的哪几种脚手架模板?

[vue-vuex]vue-cli提供了的哪几种脚手架模板&#xff1f; vue-cli2.x 好像有个simple和完整版的 vue-cli3.x 提供了自定义装箱配置 可以选装TypeScriptPWAlinte2ecss 预处理routervuex个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但…

DHCP服务器的设计

介绍 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;通常被应用在大型的局域网络环境中&#xff0c;主要作用是集中的管理、分配IP地址&#xff0c;使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息&…

Dom对象、JavaScript对象、jQuery对象区别

一、Dom对象、JavaScript对象、jQuery对象 1.1 Dom对象 文档对象模型简称DOM&#xff0c;是W3C组织推荐的处理可扩展置标语言的标准编程接口。 DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、 这些对象的行为和属性以及这些对象之间的关系。…

[vue-cli] vue-cli工程中常用的npm命令有哪些

[vue-cli] vue-cli工程中常用的npm命令有哪些 npm install&#xff1a;下载 node_modules 资源包的命令 思考问题&#xff1a; 为什么下载资源包要用npm install&#xff1f; 请你谈一下 npm run dev&#xff1a; 启动 vue-cli 开发环境的 npm命令&#xff08;3.0以下&#x1…

Spring对AspectJ的支持

1.AspectJ介绍及Pointcut注解应用 &#xff08;1&#xff09;AspectJ AspectJ的风格类似纯java注解的普通java类Spring可以使用AspectJ来做切入点解析AOP的运行时仍旧是纯的Spring AOP&#xff0c;对AspectJ的编译器或者织入无依赖性&#xff08;2&#xff09;Spring中配置Aspe…

[vue-cli]在使用vue-cli开发vue项目时,自动刷新页面的原理你了解吗?

[vue-cli]在使用vue-cli开发vue项目时&#xff0c;自动刷新页面的原理你了解吗&#xff1f; 自动刷新页面并不是vue-cli的功能&#xff0c;而是webpack的hot-module-replacement-plugin插件在做这件事&#xff0c;这个插件是webpack自带的插件&#xff0c;用来做hmr的。如果需…

git 基本使用

一、本地创建git版本库 在本地随便找个空文件夹 或者 新建一个空文件夹 初始化一下 $ mkdir newgit //新建一个空目录 $ cd newgit //进入 $ git init //使用git init命令 初始化一个Git仓库二、添加文件到Git仓库&#xff0c;分两步 使用命令git add <f…

C++ ActiveX开发的问题讨论

最近在一个项目中需要开发一个ocx插件&#xff0c;在开发过程中发现了一些问题&#xff0c;所以在此记录一下。 我想讨论的主要是函数的参数问题&#xff0c;我分别使用c,JavaScript,C#对ocx插件做了测试&#xff0c;发现不同的参数类型在这几种语言中表现的差异很大。 &#x…