【bzoj4066】 简单题
http://www.lydsy.com/JudgeOnline/problem.php?id=4066 (题目链接)
题意
维护一个矩阵,两个操作,给某一个元素加上A,求其中一个子矩阵的元素之和。强制在线。
Solution
KDtree,其它的就是跟平衡树的维护差不多。
//然而我现在还是TLE啊T_T,但是正确性拍过没问题,求大佬帮忙看看哪里挂了T_T
UPD 2016.1.9:终于是卡着时限过去了→_→
细节
注意重新构树的时候,叶子节点的左右儿子要重新赋为0,因为最初它们的左右儿子并不是0。
注意重新构树update的时候,mn和mx要重新赋值。
代码
// bzoj4066
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#define LL long long
#define inf 1<<30
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline int gi() {
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=200010;
int n,K,sz,rt;
LL ans; struct KDtree {
int val,l,r,v[2],mx[2],mn[2];
LL sum;
friend bool operator < (const KDtree a,const KDtree b) {
return a.v[K]<b.v[K];
}
}tr[maxn],t[maxn],S; void update(int k) {
for (int i=0;i<=1;i++) {
tr[k].mn[i]=tr[k].mx[i]=tr[k].v[i]; //important
if (tr[k].l) {
tr[k].mn[i]=min(tr[tr[k].l].mn[i],tr[k].mn[i]);
tr[k].mx[i]=max(tr[tr[k].l].mx[i],tr[k].mx[i]);
}
if (tr[k].r) {
tr[k].mn[i]=min(tr[tr[k].r].mn[i],tr[k].mn[i]);
tr[k].mx[i]=max(tr[tr[k].r].mx[i],tr[k].mx[i]);
}
}
tr[k].sum=tr[k].val+tr[tr[k].l].sum+tr[tr[k].r].sum;
}
void insert(int &k,int p) {
K=p;
if (!k) {tr[k=++sz]=S;return;}
if (S.v[0]==tr[k].v[0] && S.v[1]==tr[k].v[1]) {
tr[k].val+=S.val,tr[k].sum+=S.val;
return;
}
if (S<tr[k]) insert(tr[k].l,p^1);
else insert(tr[k].r,p^1);
update(k);
}
bool in(int x1,int y1,int X1,int Y1,int x2,int y2,int X2,int Y2) {
return x1>=x2 && X1<=X2 && y1>=y2 && Y1<=Y2;
}
bool out(int x1,int y1,int X1,int Y1,int x2,int y2,int X2,int Y2) {
return X1<x2 || x1>X2 || Y1<y2 || y1>Y2;
}
LL query(int k,int x,int y,int X,int Y) {
if (!k) return 0;
LL tmp=0;
if (in(tr[k].mn[0],tr[k].mn[1],tr[k].mx[0],tr[k].mx[1],x,y,X,Y)) return tr[k].sum;
if (out(tr[k].mn[0],tr[k].mn[1],tr[k].mx[0],tr[k].mx[1],x,y,X,Y)) return 0;
if (in(tr[k].v[0],tr[k].v[1],tr[k].v[0],tr[k].v[1],x,y,X,Y)) tmp+=tr[k].val;
tmp+=query(tr[k].l,x,y,X,Y)+query(tr[k].r,x,y,X,Y);
return tmp;
}
int rebuild(int l,int r,int p) {
K=p;
int mid=(l+r)>>1;
nth_element(t+l,t+mid,t+r+1);
tr[mid]=t[mid];
tr[mid].l=l<mid ? rebuild(l,mid-1,p^1) : 0; //如果不赋值为0的话之后查询或插入时就会RE
tr[mid].r=r>mid ? rebuild(mid+1,r,p^1) : 0;
update(mid);
return mid;
}
int main() {
n=gi();
ans=0;
for (int op,x1,y1,x2,y2,A,m=10000;1;) {
op=gi();if (op==3) break;
x1=gi()^ans,y1=gi()^ans;
if (op==1) {
A=gi()^ans;
S.v[0]=x1;S.v[1]=y1;S.sum=S.val=A;
S.mx[0]=S.mn[0]=x1;S.mx[1]=S.mn[1]=y1;
insert(rt,0);
if (sz==m) {
for (int i=1;i<=m;i++) t[i]=tr[i];
rt=rebuild(1,m,0);m+=10000;
}
}
else {
x2=gi()^ans,y2=gi()^ans;
ans=query(rt,x1,y1,x2,y2);
printf("%lld\n",ans);
}
}
return 0;
}
【bzoj4066】 简单题的更多相关文章
- [BZOJ2683][BZOJ4066]简单题
[BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...
- bzoj4066: 简单题 K-Dtree
bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...
- 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> # ...
- 【kd-tree】bzoj4066 简单题
同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...
- BZOJ4066:简单题(K-D Tree)
Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...
- 【BZOJ4066】简单题(KD-Tree)
[BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...
- 【BZOJ4066】简单题 KDtree
[BZOJ4066]简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...
- [bzoj4066/2683]简单题_KD-Tree
简单题 bzoj-4066 题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线. 注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdo ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
随机推荐
- 遍历目录删除指定MD5值的文件
工作需要实现一个查找出指定目录下md5值与excel表格中md5值相同的文件然后删掉的功能.我是这样做的:首先遍历指定目录,计算该目录下所有文件的md5值,以文件路径为key,md5值为value保存 ...
- 20155302 Exp2 后门原理与实践
20155302<网络对抗>后门原理与实践 实验要求 1.使用netcat获取主机操作Shell,cron启动 (0.5分) 2.使用socat获取主机操作Shell, 任务计划启动 (0 ...
- Centos 定时任务发送smtp邮件
接着上一篇文章...... 1.首先创建一个sheel的脚本命令,我是在home文件夹下面创建的命令: touch a.sh 2.编辑a.sh脚本 vim a.sh ,键入键盘 i 键 准备插入 ...
- JavaScript快速入门-ECMAScript语句
JavaScript语句(if.for.for in.do...while.while.break.continue.switch) 一.if语句 if (condition) statement1 ...
- 前端项目模块化的实践3:使用 TypeScript 的收益
以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...
- 百炼1001: Exponentiation 解题
链接:http://bailian.openjudge.cn/practice/1001/ 思路 乍一看是很简单的题目,但是答案必须高精度输出,因此需要手动实现一个高精度运算方法.如果直接使用int, ...
- 记录:TensorFlow 中的 padding 方式
TensorFlow 中卷积操作和池化操作中都有一个参数 padding,其可选值有 ['VALID', 'SAME']. 在 TensorFlow 文档中只是给出了输出张量的维度计算方式,但是并没有 ...
- Java+Netty、Vue+Element-UI实现的即时通信应用 leo-im
之前工作接触了几个开源的IM产品,再加上曾经用Netty实现过几个服务,于是就有了用Netty实现一个IM的想法,于是用业余时间写了一个IM,和喜欢Netty的程序员们分享. 考虑到方便扩展,在服务端 ...
- FFMPEG的基础使用
由于最近要将yuv视频下采样,于是使用ffmpeg快速将yuv视频下降分辨率.在此记录ffmpeg的基础使用方法和所遇到的问题: 下载,可到官网下载:https://www.ffmpeg.org/ . ...
- Unity---Inspector面板自定义
一. 参数自定义 一个含有成员的类Player using System.Collections; using System.Collections.Generic; using UnityEngin ...